Apache NIFI – NjĂ« pĂ«rmbledhje e mundĂ«sive nĂ« praktikĂ«

Hyrje

Si ndodhi qĂ« nĂ« vendin tim aktual tĂ« punĂ«s mĂ« duhej tĂ« njihesha me kĂ«tĂ« teknologji. Do tĂ« filloj me njĂ« histori tĂ« vogĂ«l. NĂ« njĂ« takim tĂ« fundit, ekipi ynĂ« u tha se duhet tĂ« krijojmĂ« njĂ« integrim me njĂ« sistem tĂ« njohur. NjĂ« integrim do tĂ« thoshte se ky sistem i njohur do tĂ« na dĂ«rgonte kĂ«rkesa pĂ«rmes HTTP nĂ« njĂ« pikĂ« fundore tĂ« caktuar, ndĂ«rsa ne, siç Ă«shtĂ« e çuditshme, do tĂ« dĂ«rgonim pĂ«rgjigje nĂ« formĂ«n e njĂ« mesazhi SOAP. Duket mjaft e thjeshtĂ« dhe triviale. Nga kjo rrjedh se duhet të 

Detyra

KrijojmĂ« 3 shĂ«rbime. E para prej tyre Ă«shtĂ« ShĂ«rbimi i pĂ«rditĂ«simit tĂ« DB. Ky shĂ«rbim, kur merr tĂ« dhĂ«na tĂ« reja nga njĂ« sistem i jashtĂ«m, pĂ«rditĂ«son tĂ« dhĂ«nat nĂ« bazĂ«n e tĂ« dhĂ«nave dhe gjeneron njĂ« skedar nĂ« formatin CSV, pĂ«r ta transferuar atĂ« nĂ« sistemin tjetĂ«r. Aktivizohet pika fundore e shĂ«rbimit tĂ« dytĂ« — ShĂ«rbimi i transportit pĂ«rmes FTP, i cili merr skedarin e dĂ«rguar, e validon atĂ« dhe e ruan nĂ« hapĂ«sirĂ«n e skedarĂ«ve pĂ«rmes FTP. ShĂ«rbimi i tretĂ« — ShĂ«rbimi i transferimit tĂ« tĂ« dhĂ«nave pĂ«r konsumatorin, punon asinkronisht me dy shĂ«rbimet e para. Ai pranon njĂ« kĂ«rkesĂ« nga njĂ« sistem i jashtĂ«m pĂ«r tĂ« marrĂ« skedarin pĂ«r tĂ« cilin u fol mĂ« lart, merr skedarin e gatshĂ«m tĂ« pĂ«rgjigjjes, 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 konsumatorĂ«t e informacionit janĂ« shumĂ«, rreth 1000 kĂ«rkesa pĂ«r tĂ« dhĂ«na nĂ« minutĂ«. ShĂ«rbimet janĂ« gjithmonĂ« tĂ« disponueshme dhe instancat e tyre ndodhen nĂ« mjedise tĂ« ndryshme, si testi, demo, para-prodhimi dhe prodhimi. MĂ« poshtĂ« paraqitet skema e funksionimit tĂ« kĂ«tyre shĂ«rbimeve. MenjĂ«herĂ« do tĂ« sqaroj se disa detaje janĂ« thjeshtuar pĂ«r tĂ« shmangur kompleksitetin e tepĂ«rt.

Apache NIFI – NjĂ« pĂ«rmbledhje e mundĂ«sive nĂ« praktikĂ«

Thellimi teknik

Kur planifikimin e zgjidhjes së detyrës, së pari u vendos të krijohen aplikacione në java duke përdorur Spring framework, me balancuesin Nginx, bazën e të dhënave Postgres dhe disa teknologji të tjera. Për shkak se koha për zhvillimin e zgjidhjes teknike lejonte shqyrtimin e qasjeve të tjera për zgjidhjen e kësaj detyre, u fokusua në teknologjinë e njohur në disa rrethe, Apache NIFI. Të them të drejtën, kjo teknologji na ndihmoi të vërejmë këto 3 shërbime. Në këtë artikull do të përshkruhet zhvillimi i shërbimit të transportit të skedarëve dhe shërbimit të transferimit të të dhënave te konsumatori, megjithatë, nëse artikulli do të pranohet, do të shkruaj mbi shërbimin e përditësimit të të dhënave në bazën e të dhënave.

ÇfarĂ« Ă«shtĂ« kjo

NIFI pĂ«rfaqĂ«son njĂ« arkitekturĂ« tĂ« shpĂ«rndarĂ« pĂ«r ngarkimin dhe pĂ«rpunimin e shpejtĂ« tĂ« tĂ« dhĂ«nave nĂ« paralel, njĂ« numĂ«r tĂ« madh plugins pĂ«r burimet dhe transformimet, versionimin e konfigurimeve dhe shumĂ« mĂ« tepĂ«r. NjĂ« bonus tĂ« kĂ«ndshĂ«m Ă«shtĂ« se Ă«shtĂ« shumĂ« i thjeshtĂ« 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Ă« ilustrimin mĂ« poshtĂ«. Dokumentacioni mĂ« i hollĂ«sishĂ«m mbi ndĂ«rveprimin dhe konfigurimin e proceseve Ă«shtĂ« shkruar kĂ«tu , pĂ«r ata qĂ« flasin rusisht — kĂ«tu. NĂ« dokumentacion Ă«shtĂ« pĂ«rshkruar shkĂ«lqyeshĂ«m si tĂ« shkarkoni dhe filloni NIFI, si dhe si tĂ« krijoni procese, ato janĂ« katrorĂ«t
Ideja për të shkruar këtë artikull lindi pas një kërkimi të gjatë dhe strukturimit 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.

Shembulli

KĂ«tu shqyrtohet njĂ« shembull se si ndodhin ndĂ«rveprimet mes katrorĂ«ve. Skema e pĂ«rgjithshme Ă«shtĂ« mjaft e thjeshtĂ«: Marrim njĂ« kĂ«rkesĂ« HTTP (Teoretikisht me njĂ« skedar nĂ« trup tĂ« 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 qĂ« tregon se kĂ«rkesa Ă«shtĂ« marrĂ«, paralelisht nis procesi i marrjes sĂ« skedarit nga depoja dhe mĂ« pas procesi i transferimit tĂ« tij pĂ«rmes FTP nĂ« depo. ËshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se proceset ndĂ«rveprojnĂ« me njĂ«ri-tjetrin pĂ«rmes asaj qĂ« quhet flowFile. Kjo Ă«shtĂ« njĂ« entitet bazik nĂ« NIFI qĂ« ruan atributet dhe pĂ«rmbajtjen. PĂ«rmbajtja — tĂ« dhĂ«nat qĂ« pĂ«rfaqĂ«sohen nga skedari i rrjedhĂ«s. Pra, nĂ« mĂ«nyrĂ« bruto, nĂ«se merrni njĂ« skedar nga njĂ« katror dhe e dĂ«rgoni atĂ« nĂ« njĂ« tjetĂ«r, pĂ«rmbajtja do tĂ« jetĂ« skedari juaj.

Apache NIFI – NjĂ« pĂ«rmbledhje e mundĂ«sive nĂ« praktikĂ«

Siç mund ta vini re — nĂ« kĂ«tĂ« ilustrim Ă«shtĂ« pĂ«rshkruar procesi i pĂ«rgjithshĂ«m. HandleHttpRequest — merr kĂ«rkesat, ReplaceText — gjeneron trupin e pĂ«rgjigjes, HandleHttpResponse — jep pĂ«rgjigjen. FetchFile — merr skedarin nga depoja e skedarĂ«ve dhe e dĂ«rgon nĂ« katrorin PutSftp — e vendos kĂ«tĂ« skedar nĂ« FTP, nĂ« adresĂ«n e specifikuar. Tani mĂ« shumĂ« rreth kĂ«tij procesi.

NĂ« kĂ«tĂ« rast — kĂ«rkesa Ă«shtĂ« fillimi i gjithçkaje. Le tĂ« shohim parametrat e saj tĂ« konfigurimit.

Apache NIFI – NjĂ« pĂ«rmbledhje e mundĂ«sive nĂ« praktikĂ«

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

Tani le tĂ« shqyrtojmĂ« parametrat e konfigurimit tĂ« katrorit ReplaceText. TĂ«rĂ« rĂ«ndĂ«si ka ReplacementValue — kjo Ă«shtĂ« ajo qĂ« do t'i kthehet pĂ«rdoruesit si pĂ«rgjigje. NĂ« settings mund tĂ« rregullohet niveli i regjistrimit, log-et mund tĂ« shihen {ku u desh nifi}\/nifi-1.9.2\/logs atje gjithashtu ka parametrat failure\/success — duke u bazuar nĂ« kĂ«to parametra mund tĂ« rregullohet procesi nĂ« tĂ«rĂ«si. Pra, nĂ« rast tĂ« njĂ« pĂ«rpunimi tĂ« suksesshĂ«m tĂ« tekstit — do tĂ« niset procesi i dĂ«rgimit tĂ« pĂ«rgjigjes pĂ«r pĂ«rdoruesin, ndĂ«rsa nĂ« rastin tjetĂ«r thjesht regjistrojmĂ« njĂ« proces tĂ« dĂ«shtuar.

Apache NIFI – NjĂ« pĂ«rmbledhje e mundĂ«sive nĂ« praktikĂ«

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

Apache NIFI – NjĂ« pĂ«rmbledhje e mundĂ«sive nĂ« praktikĂ«

Me kĂ«rkesat dhe pĂ«rgjigjet u shuguruam — le tĂ« kalojmĂ« nĂ« marrjen e skedarit dhe vendosjen e tij nĂ« serverin FTP. FetchFile — merr skedarin sipas rrugĂ«s e cila Ă«shtĂ« caktuar nĂ« konfigurim dhe e dĂ«rgon atĂ« nĂ« procesin e ardhshĂ«m.

Apache NIFI – NjĂ« pĂ«rmbledhje e mundĂ«sive nĂ« praktikĂ«

Më pas, kati PutSftp vendos skedarin në storien e skedarëve. Parametrat e konfigurimit mund t'i shohim më poshtë.

Apache NIFI – NjĂ« pĂ«rmbledhje e mundĂ«sive nĂ« praktikĂ«

ËshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se secili kat Ă«shtĂ« njĂ« proces i veçantĂ« qĂ« duhet tĂ« aktivizohet. Ne shqyrtuam shembullin mĂ« tĂ« thjeshtĂ« qĂ« nuk kĂ«rkon ndonjĂ« personalizim tĂ« komplikuar. Tani do tĂ« shqyrtojmĂ« njĂ« proces pak mĂ« tĂ« komplikuar, ku do tĂ« shkruajmĂ« pak mĂ« shumĂ« nĂ« Groovy.

Shembulli më i komplikuar

Shërbimi i transferimit të të dhënave për konsumatorin rezultoi pak më i komplikuar 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 mundĂ«sive nĂ« praktikĂ«

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

Mendoj se nuk ka nevojĂ« tĂ« pĂ«rshkruaj pĂ«rsĂ«ri katet qĂ« pamĂ« mĂ« sipĂ«r — do tĂ« kalojmĂ« menjĂ«herĂ« te tĂ« rejat. NĂ«se ju nevojitet tĂ« redaktoni ndonjĂ« skedar dhe katet e zakonshme si ReplaceText nuk i pĂ«rmbushin kĂ«rkesat, do t'ju duhet tĂ« shkruani skriptin tuaj. Kjo mund tĂ« bĂ«het duke pĂ«rdorur katin ExecuteGroovyScript. CilĂ«simet e tij janĂ« paraqitur mĂ« poshtĂ«.

Apache NIFI – NjĂ« pĂ«rmbledhje e mundĂ«sive nĂ« praktikĂ«

Ka janĂ« dy mundĂ«si pĂ«r tĂ« ngarkuar skiptin nĂ« kĂ«tĂ« katror. E para Ă«shtĂ« pĂ«rmes ngarkimit tĂ« njĂ« skedari me skiptin. E dyta Ă«shtĂ« duke futur skiptin nĂ« scriptBody. Sa di unĂ«, katrori executeScript mbĂ«shtet disa gjuhĂ« programimi - njĂ« prej tyre Ă«shtĂ« groovy. Do tĂ« zhgĂ«njej zhvilluesit e java-s - nuk Ă«shtĂ« e mundur tĂ« shkruhen skipte nĂ« kĂ«to katrorĂ«. PĂ«r ata qĂ« kanĂ« dĂ«shirĂ« tĂ« madhe - duhet tĂ« krijoni njĂ« katror tĂ« personalizuar dhe ta futni nĂ« sistemin NIFI. E gjithĂ« kjo operacion shoqĂ«rohet me njĂ« sĂ«rĂ« tĂ« gjatĂ« gjeste, tĂ« cilat nuk do t'i trajtojmĂ« brenda kĂ«tij artikulli. UnĂ« zgjodha gjuhĂ«n groovy. MĂ« poshtĂ« Ă«shtĂ« njĂ« skipt testues qĂ« thjesht pĂ«rditĂ«son nĂ« mĂ«nyrĂ« inkrementale id-nĂ« nĂ« mesazhin SOAP. ËshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet. Merrni skedarin nga flowFile, e pĂ«rditĂ«soni atĂ«, mos harroni ta ktheoni, tĂ« pĂ«rditĂ«suar, pĂ«rsĂ«ri aty. Gjithashtu, Ă«shtĂ« e rĂ«ndĂ«sishme tĂ« theksohet qĂ« jo tĂ« gjitha bibliotekat janĂ« tĂ« lidhura. Mund tĂ« ndodhĂ« qĂ« ju pĂ«rsĂ«ri do tĂ« duhet tĂ« importoni njĂ« nga libraritĂ«. NjĂ« tjetĂ«r disavantazh Ă«shtĂ« se skiptin nĂ« kĂ«tĂ« katror Ă«shtĂ« mjaft e vĂ«shtirĂ« ta debagoni. Ekziston njĂ« mĂ«nyrĂ« pĂ«r t'u lidhur me JVM NIFI dhe pĂ«r tĂ« filluar procesin e debagimit. Personalisht, kam nisur njĂ« aplikacion lokal dhe kam simuluar marrjen e skedarit nga sesioni. Edhe pĂ«r debagimin kam punuar lokalish. Gabimet qĂ« dalin gjatĂ« ngarkimit tĂ« skiptit janĂ« mjaft tĂ« lehta pĂ«r t'u gjetur nĂ« Google dhe shkruhen nga vetĂ« 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("Gabim gjatë procesimit të validate.groovy", e)
    session.transfer(flowFile, REL_FAILURE)
}

Në të vërtetë, këtu përfundon personalizimi i katrorit. Më pas, skedari i përditësuar kalon në katrorin që merret me dërgimin e skedarit në server. Më poshtë janë cilësimet e këtij katrori.

Apache NIFI – NjĂ« pĂ«rmbledhje 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ë tregojmë se është saktësisht SOAP.

Apache NIFI – NjĂ« pĂ«rmbledhje e mundĂ«sive nĂ« praktikĂ«

Shtojmë disa pronësi si host dhe veprimi (soapAction). Ruajmë, kontrollojmë. Më shumë informacion se si të dërgoni kërkesa SOAP mund të shihni. këtu

Kemi shqyrtuar disa mundĂ«si pĂ«r pĂ«rdorimin e proceseve NIFI. Si ndĂ«rveprojnĂ« ato dhe çfarĂ« pĂ«rfitimi real pĂ«rfitojmĂ«. Shembujt e shqyrtuar janĂ« testues dhe pak ndryshojnĂ« nga ajo qĂ« Ă«shtĂ« realisht nĂ« prodhim. Shpresoj se ky artikull do 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

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