Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

Hyrje

Në vendin tim aktual të punës, pata rastin të njoh këtë teknologji. Të filloj me një histori të shkurtër. gjatë një mbledhjeje, ekipit tonë iu tha se duhej të krijonim një integrim me një sistem të njohur. Me integrimin nënkuptohej se ky sistem i njohur do na dërgonte kërkesa nëpërmjet HTTP në një endpoint të caktuar, dhe ne, siç duket, do të dërgonim përgjigje prapa në formën e një mesazhi SOAP. Duket e thjeshtë dhe banale. Nga kjo ndjek që duhet...

Detyra

Krijoni 3 shĂ«rbime. ShĂ«rbimi i parĂ« Ă«shtĂ« ShĂ«rbimi i pĂ«rditĂ«simit tĂ« DB. Ky shĂ«rbim, kur merr tĂ« dhĂ«na tĂ« reja nga njĂ« sistem tjetĂ«r, pĂ«rditĂ«son tĂ« dhĂ«nat nĂ« bazĂ«n e tĂ« dhĂ«nave dhe gjeneron njĂ« skedar nĂ« formatin CSV, pĂ«r ta transferuar nĂ« sistemin nĂ« vijim. Aktivizohet nĂ«npikĂ« tĂ« dytĂ« tĂ« shĂ«rbimit — ShĂ«rbimi i transportit pĂ«rmes FTP, i cili merr skedarin e dĂ«rguar, e validon atĂ« dhe e ruan nĂ« njĂ« ruajtĂ«s skedarĂ«sh pĂ«rmes FTP. ShĂ«rbimi i tretĂ« — ShĂ«rbimi i dĂ«rgimit tĂ« tĂ« dhĂ«nave tek konsumatori, punon asinkronisht me dy tĂ« parĂ«t. Ai merr njĂ« kĂ«rkesĂ« nga njĂ« sistem tĂ« jashtĂ«m, pĂ«r tĂ« marrĂ« skedarin pĂ«r tĂ« cilin u pĂ«rmend mĂ« sipĂ«r, merr skedarin e gatshĂ«m tĂ« pĂ«rgjigjes, e modifikon atĂ« (pĂ«rditĂ«son fushat id, description, linkToFile) dhe dĂ«rgon pĂ«rgjigjen nĂ« formĂ«n e njĂ« mesazhi SOAP. Pra, nĂ« pĂ«rgjithĂ«si, pamja Ă«shtĂ« kĂ«shtu: dy shĂ«rbimet e para fillojnĂ« punĂ«n e tyre vetĂ«m kur vijnĂ« tĂ« dhĂ«na pĂ«r pĂ«rditĂ«sim. ShĂ«rbimi i tretĂ« punon vazhdimisht pasi ka shumĂ« konsumatorĂ« tĂ« informacionit, rreth 1000 kĂ«rkesa pĂ«r tĂ« marrĂ« tĂ« dhĂ«na nĂ« minutĂ«. ShĂ«rbimet janĂ« tĂ« aksesueshme vazhdimisht dhe instancat e tyre janĂ« tĂ« vendosura nĂ« mjedise tĂ« ndryshme, si test, demo, para-lĂ«shim dhe prodhim. MĂ« poshtĂ« Ă«shtĂ« paraqitur skema e funksionimit tĂ« kĂ«tyre shĂ«rbimeve. MenjĂ«herĂ« po shpjegoj se disa detaje janĂ« thjeshtuar pĂ«r tĂ« shmangur kompleksitetin e tepruar.

Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

Thellimi teknik

Gjatë planifikimit të zgjidhjes së problemit, së pari vendosëm të zhvillojmë aplikacione në java duke përdorur Spring framework, me balancuesin Nginx, bazën e të dhënave Postgres dhe gjëra të tjera teknike e jo shumë. Duke qenë se koha për të punuar në zgjidhjen teknike lejonte shqyrtimin e qasjeve të tjera për këtë problem, vëmendja u përqendrua në teknologjinë Apache NIFI, e cila është bërë e njohur në disa qarqe. Të them të drejtën, kjo teknologji na lejoi të vëmë re këto 3 shërbime. Në këtë artikull do të përshkruhet zhvillimi i shërbimit të transportit të skedareve dhe shërbimit të transferimit të të dhënave te konsumatori; megjithatë, nëse artikulli do të pranohet mirë, do të shkruaj për shërbimin e përditësimit të të dhënave në bazën e të dhënave.

ÇfarĂ« Ă«shtĂ« kjo?

NIFI paraqet njĂ« arkitekturĂ« tĂ« shpĂ«rndarĂ« pĂ«r ngarkimin dhe pĂ«rpunimin e tĂ« dhĂ«nave nĂ« mĂ«nyrĂ« tĂ« shpejtĂ« dhe paralele, njĂ« numĂ«r tĂ« madh pluginsh pĂ«r burimet dhe transformimet, versionimin e konfigurimeve dhe shumĂ« mĂ« tepĂ«r. NjĂ« bonus i kĂ«ndshĂ«m Ă«shtĂ« se Ă«shtĂ« shumĂ« e lehtĂ« pĂ«r t'u pĂ«rdorur. Proceset triviale, si getFile, sendHttpRequest dhe tĂ« tjera — mund tĂ« paraqiten si katrorĂ«. Çdo katror pĂ«rfaqĂ«son njĂ« proces, ndĂ«rveprimi i tĂ« cilit mund tĂ« shihet nĂ« figurĂ«n mĂ« poshtĂ«. Dokumentacioni mĂ« i detajuar mbi ndĂ«rveprimin e konfigurimit tĂ« proceseve Ă«shtĂ« shkruar kĂ«tu , pĂ«r ata qĂ« flasin rusisht — kĂ«tu. NĂ« dokumentacion, Ă«shtĂ« shkruar shumĂ« mirĂ« se si tĂ« shkarkoni dhe tĂ« lançoni NIFI, si dhe si tĂ« krijoni procese, ato janĂ« katrorĂ«t
Ideja për të shkruar një artikull lindi pas kërkimeve të zgjatura dhe strukturuar të informacionit të marrë në diçka të kuptueshme, si dhe dëshira për të lehtësuar pak jetën e zhvilluesve të ardhshëm.

Shembuj

KĂ«tu Ă«shtĂ« njĂ« shembull i mĂ«nyrĂ«s si ndĂ«rveprojnĂ« katrat me njĂ«ri-tjetrin. Skema e pĂ«rgjithshme Ă«shtĂ« mjaft e thjeshtĂ«: Marrim njĂ« kĂ«rkesĂ« HTTP (nĂ« teorinĂ« me njĂ« skedar nĂ« trupin e kĂ«rkesĂ«s. PĂ«r tĂ« demonstruar mundĂ«sitĂ« e NIFI, nĂ« kĂ«tĂ« shembull kĂ«rkesa fillon procesin e marrjes sĂ« skedarit nga depoja lokale), pastaj dĂ«rgojmĂ« njĂ« pĂ«rgjigje prapa qĂ« kĂ«rkesa Ă«shtĂ« pranuar, nĂ« mĂ«nyrĂ« paralele fillon procesi i marrjes sĂ« skedarit nga depoja dhe mĂ« pas procesi i transferimit tĂ« tij pĂ«rmes FTP nĂ« depo. Duhet tĂ« theksohet se proceset ndĂ«rveprojnĂ« me njĂ«ri-tjetrin pĂ«rmes asaj qĂ« quhet flowFile. Kjo Ă«shtĂ« njĂ« entitet bazik nĂ« NIFI, i cili ruan ATTRIBUTET dhe pĂ«rmbajtjen. PĂ«rmbajtja — tĂ« dhĂ«nat qĂ« pĂ«rfaqĂ«sohen nga skedari i rrjedhĂ«s. Pra, nĂ« mĂ«nyrĂ« tĂ« thjeshtĂ«, nĂ«se keni marrĂ« njĂ« skedar nga njĂ« katror dhe e dĂ«rgoni nĂ« njĂ« tjetĂ«r, pĂ«rmbajtja do tĂ« jetĂ« skedari juaj.

Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

Siç mund ta vini re — nĂ« kĂ«tĂ« skicĂ« Ă«shtĂ« ilustruar procesi i pĂ«rgjithshĂ«m. HandleHttpRequest — pranon kĂ«rkesat, ReplaceText — gjeneron trupin e pĂ«rgjigjes, HandleHttpResponse — jep pĂ«rgjigjen. FetchFile — merr skedarin nga depoja dhe e dĂ«rgon tek katrori PutSftp — e vendos kĂ«tĂ« skedar nĂ« FTP, nĂ« adresĂ«n e shĂ«nuar. Tani le tĂ« flasim mĂ« shumĂ« mbi kĂ«tĂ« proces.

NĂ« kĂ«tĂ« rast — kĂ«rkesa Ă«shtĂ« gjithçka fillim. Le tĂ« shikojmĂ« parametrat e saj tĂ« konfigurimit.

Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

KĂ«tu gjithçka Ă«shtĂ« mjaft triviale pĂ«rveç StandartHttpContextMap — kjo Ă«shtĂ« njĂ« shĂ«rbim qĂ« lejon dĂ«rgimin dhe pranimin e kĂ«rkesave. MĂ« shumĂ« detaje dhe madje me shembuj mund tĂ« shikoni — kĂ«tu

MĂ« pas do tĂ« shohim parametrat e konfigurimit tĂ« ReplaceText katrorit. Duhet tĂ« kushtohet vĂ«mendje ReplacementValue — ky Ă«shtĂ« elementi qĂ« do t’i kthehet pĂ«rdoruesit si pĂ«rgjigje. NĂ« settings mund tĂ« rregulloni nivelin e regjistrimit, log-et mund tĂ« shikohen {ku u nxorĂ«n nifi}/nifi-1.9.2/logs, aty ka gjithashtu parametrat failure/success — duke u bazuar nĂ« kĂ«to parametra mund tĂ« rregullohet procesi nĂ« tĂ«rĂ«si. Pra, nĂ« rast tĂ« suksesshĂ«m tĂ« pĂ«rpunimit tĂ« tekstit — do tĂ« thirret njĂ« proces dĂ«rgimi pĂ«rgjigjeje pĂ«r pĂ«rdoruesin, ndryshe ne thjesht do ta regjistrojmĂ« procesin e dĂ«shtuar.

Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

Në pronat e HandleHttpResponse nuk ka asgjë interesante përveç statusit në krijimin e suksesshëm të përgjigjes.

Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

Me pĂ«rgjigjen e kĂ«rkĂ«sĂ«s u mĂ«suam— le tĂ« kalojmĂ« tek marrja e skedarit dhe vendosja e tij nĂ« serverin FTP. FetchFile — merr skedarin nga rruga e caktuar nĂ« settings dhe e dĂ«rgon atĂ« nĂ« procesin vijues.

Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

Dhe katrori PutSftp vendos skedarin në magazinën e skedarëve. Parametrat e konfigurimit mund të shihen më poshtë.

Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

Kujdesi është që çdo katror është një proces i veçantë që duhet të aktivizohet. Ne shqyrtuam shembullin më të thjeshtë që nuk kërkon ndonjë personalizim të ndërlikuar. Tani do të shqyrtojmë një proces pak më të komplikuar, ku do të shkruajmë pak në Groovy.

Shembulli më i komplikuar

Shërbimi i transmetimit të të dhënave për konsumatorin doli të ishte pak më i ndërlikuar për shkak të procesit të modifikimit të mesazhit SOAP. Procesi i përgjithshëm paraqitet në figurën më poshtë.

Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

Këtu ideja nuk është shumë e komplikuar: morëm një kërkesë nga konsumatori për të dhëna, dërguam një përgjigje se morëm mesazhin, aktivizuam procesin e marrjes së skedarit të përgjigjes, pastaj e redaktuam atë me një logjikë të caktuar, pas së cilës e dërguam skedarin për konsumatorin në formën e një mesazhi SOAP në server.

Nuk themi se nuk ka kuptim tĂ« pĂ«rshkruajmĂ« pĂ«rsĂ«ri katrorĂ«t qĂ« pamĂ« mĂ« sipĂ«r — le tĂ« kalojmĂ« drejtpĂ«rdrejt nĂ« tĂ« rinjtĂ«. NĂ«se ju nevojitet tĂ« redaktoni ndonjĂ« skedar dhe katrorĂ«t e zakonshĂ«m si ReplaceText nuk janĂ« tĂ« pĂ«rshtatshĂ«m, do t'ju duhet tĂ« shkruani skenarin tuaj. Kjo mund tĂ« bĂ«het me ndihmĂ«n e katrorit ExecuteGroogyScript. CilĂ«simet e tij paraqiten mĂ« poshtĂ«.

Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

JanĂ« dy mundĂ«si pĂ«r ngarkimin e skriptit nĂ« kĂ«tĂ« katror. E para — Ă«shtĂ« pĂ«rmes ngarkimit tĂ« njĂ« skedari me skriptin. E dyta — duke e futur skriptin nĂ« scriptBody. Sa di unĂ«, katrori executeScript mbĂ«shtet disa gjuhĂ« programimi — njĂ« prej tyre Ă«shtĂ« groovy. Do tĂ« zhgĂ«njej zhvilluesit e java — nuk Ă«shtĂ« e mundur tĂ« shkruhen skripte nĂ« kĂ«to katrorĂ« me java. PĂ«r ata qĂ« e dĂ«shirojnĂ« shumĂ« — duhet tĂ« krijoni njĂ« katror tĂ« personalizuar dhe ta ngjini atĂ« nĂ« sistemin NIFI. I gjithĂ« ky operacion shoqĂ«rohet me valle bastante tĂ« gjata me bubullimĂ«, me tĂ« cilat nuk do tĂ« merremi nĂ« kuadĂ«r tĂ« kĂ«tij artikulli. Kam zgjedhur gjuhĂ«n groovy. MĂ« poshtĂ« paraqitet njĂ« skript testues qĂ« thjesht e pĂ«rditĂ«son id-nĂ« nĂ« mesazhin SOAP nĂ« mĂ«nyrĂ« inkrementale. ËshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet. Ju merrni skedarin nga flowFile, e pĂ«rditĂ«soni atĂ«, mos harroni se duhet, e pĂ«rditĂ«suar, ta vendosni pĂ«rsĂ«ri aty. Gjithashtu, duhet tĂ« theksohet se nuk janĂ« tĂ« gjitha bibliotekat tĂ« lidhura. Mund tĂ« ndodhĂ« qĂ« do t'ju duhet tĂ« importoni njĂ« nga librat. NjĂ« tjetĂ«r disavantazh Ă«shtĂ« se skripti nĂ« kĂ«tĂ« katror Ă«shtĂ« mjaft i vĂ«shtirĂ« pĂ«r t'u debuguar. Ka njĂ« mĂ«nyrĂ« pĂ«r t'u lidhur me JVM NIFI dhe pĂ«r tĂ« filluar procesin e debugimit. Personalmente, kam nisur njĂ« aplikacion lokal dhe kam imituar marrjen e skedarit nga seanca. Kam bĂ«rĂ« debugimin gjithashtu nĂ« mĂ«nyrĂ« lokale. Gabimet qĂ« shfaqen gjatĂ« ngarkimit tĂ« skriptit janĂ« mjaft tĂ« lehta pĂ«r t'u gjetur nĂ« Google dhe shkruhen nga NIFI nĂ« log.

import org.apache.commons.io.IOUtils
import groovy.xml.XmlUtil
import java.nio.charset.*
import groovy.xml.StreamingMarkupBuilder

def flowFile = session.get()
if (!flowFile) return
try {
    flowFile = session.write(flowFile, { inputStream, outputStream ->
        String result = IOUtils.toString(inputStream, "UTF-8");
        def recordIn = new XmlSlurper().parseText(result)
        def element = recordIn.depthFirst().find {
            it.name() == 'id'
        }

        def newId = Integer.parseInt(element.toString()) + 1
        def recordOut = new XmlSlurper().parseText(result)
        recordOut.Body.ClientMessage.RequestMessage.RequestContent.content.MessagePrimaryContent.ResponseBody.id = newId

        def res = new StreamingMarkupBuilder().bind { mkp.yield recordOut }.toString()
        outputStream.write(res.getBytes(StandardCharsets.UTF_8))
} as StreamCallback)
     session.transfer(flowFile, REL_SUCCESS)
}
catch(Exception e) {
    log.error("Error during processing of validate.groovy", e)
    session.transfer(flowFile, REL_FAILURE)
}

Kjo është pikërisht ku përfundon personalizimi i katrorit. Tani, skedari i përditësuar kalon në katrorin që merret me dërgimin e skedarit në server. Më poshtë janë paraqitur konfigurimet e këtij katrori.

Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

Përshkruajmë metodën me të cilën do të dërgohet mesazhi SOAP. Shkruajmë se ku. Më pas, duhet të specifikojmë se është pikërisht SOAP.

Apache NIFI — NjĂ« pĂ«rmbledhje e shkurtĂ«r e mundĂ«sive nĂ« praktikĂ«

Shtojmë disa pronarë si host dhe veprimin (soapAction). Ruajmë, kontrollojmë. Më shumë detaje për dërgimin e mesazheve SOAP mund të shihni. këtu

Ne shqyrtuam disa mënyra se si përdoren proceset NIFI. Si ndërveprojnë ato dhe çfarë dobie reale sjellin. Shembujt e shqyrtuar janë testues dhe pak ndryshe nga ato që ndodhin në praktikë. Shpresoj që ky artikull të jetë disi i dobishëm për zhvilluesit. Faleminderit për vëmendjen. Nëse keni ndonjë pyetje - shkruani. Do të përpiqem të përgjigjem.

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster