పరిచయం
నా ప్రస్తుత పని ప్రదేశంలో నేను ఈ సాంకేతికతతో పరిచయం పొందవలసి వచ్చింది. నేను కొద్దిగా నేపథ్యంతో ప్రారంభిస్తాను. తదుపరి సమావేశంలో, మేము ఏకీకరణను సృష్టించాల్సిన అవసరం ఉందని మా బృందానికి చెప్పబడింది తెలిసిన వ్యవస్థ. ఇంటిగ్రేషన్ ద్వారా ఈ ప్రసిద్ధ సిస్టమ్ మాకు HTTP ద్వారా అభ్యర్థనలను నిర్దిష్ట ముగింపు బిందువుకు పంపుతుంది మరియు మేము విచిత్రమేమిటంటే, SOAP సందేశం రూపంలో ప్రతిస్పందనలను తిరిగి పంపుతాము. ప్రతిదీ సాధారణ మరియు చిన్నవిషయం అనిపిస్తుంది. దీని నుండి మీకు కావలసింది...
పని
3 సేవలను సృష్టించండి. వాటిలో మొదటిది డేటాబేస్ అప్డేట్ సర్వీస్. ఈ సేవ, థర్డ్-పార్టీ సిస్టమ్ నుండి కొత్త డేటా వచ్చినప్పుడు, డేటాబేస్లోని డేటాను అప్డేట్ చేస్తుంది మరియు దానిని తదుపరి సిస్టమ్కు బదిలీ చేయడానికి CSV ఆకృతిలో ఫైల్ను రూపొందిస్తుంది. రెండవ సేవ యొక్క ముగింపు స్థానం అంటారు - బదిలీ చేయబడిన ఫైల్ను స్వీకరించే FTP రవాణా సేవ, దానిని ధృవీకరిస్తుంది మరియు FTP ద్వారా ఫైల్ నిల్వలో ఉంచుతుంది. మూడవ సేవ, వినియోగదారు డేటా బదిలీ సేవ, మొదటి రెండింటితో అసమకాలికంగా పనిచేస్తుంది. ఇది పైన చర్చించిన ఫైల్ను స్వీకరించడానికి మూడవ పక్షం బాహ్య సిస్టమ్ నుండి అభ్యర్థనను అందుకుంటుంది, సిద్ధంగా ఉన్న ప్రతిస్పందన ఫైల్ను తీసుకుంటుంది, దానిని సవరించి (ఐడి, వివరణ, లింక్టోఫైల్ ఫీల్డ్లను నవీకరిస్తుంది) మరియు ప్రతిస్పందనను SOAP సందేశం రూపంలో పంపుతుంది. అంటే, మొత్తం చిత్రం క్రింది విధంగా ఉంటుంది: నవీకరణ కోసం డేటా వచ్చినప్పుడు మాత్రమే మొదటి రెండు సేవలు తమ పనిని ప్రారంభిస్తాయి. మూడవ సేవ నిరంతరం పని చేస్తుంది ఎందుకంటే చాలా మంది సమాచారం వినియోగదారులు ఉన్నారు, నిమిషానికి డేటా కోసం 1000 అభ్యర్థనలు. సేవలు నిరంతరం అందుబాటులో ఉంటాయి మరియు వాటి ఉదాహరణలు పరీక్ష, డెమో, ప్రీ-ప్రొడక్షన్ మరియు ఉత్పత్తి వంటి విభిన్న వాతావరణాలలో ఉంటాయి. ఈ సేవలు ఎలా పని చేస్తాయనే రేఖాచిత్రం క్రింద ఉంది. అనవసరమైన సంక్లిష్టతను నివారించడానికి కొన్ని వివరాలు సరళీకృతం చేయబడ్డాయి అని నేను వెంటనే స్పష్టం చేస్తాను.
సాంకేతిక డీపెనింగ్
సమస్యకు పరిష్కారాన్ని ప్లాన్ చేస్తున్నప్పుడు, మేము మొదట స్ప్రింగ్ ఫ్రేమ్వర్క్, Nginx balancer, Postgres డేటాబేస్ మరియు ఇతర సాంకేతిక మరియు సాంకేతిక విషయాలను ఉపయోగించి జావాలో అప్లికేషన్లను రూపొందించాలని నిర్ణయించుకున్నాము. సాంకేతిక పరిష్కారాన్ని అభివృద్ధి చేయడానికి సమయం ఈ సమస్యను పరిష్కరించడానికి ఇతర విధానాలను పరిగణలోకి తీసుకోవడానికి అనుమతించినందున, మా దృష్టి కొన్ని సర్కిల్లలో ఫ్యాషన్ అయిన Apache NIFI సాంకేతికతపై పడింది. ఈ సాంకేతికత ఈ 3 సేవలను గమనించడానికి మాకు అనుమతినిచ్చిందని నేను వెంటనే చెబుతాను. ఈ కథనం వినియోగదారుకు ఫైల్ రవాణా సేవ మరియు డేటా బదిలీ సేవ యొక్క అభివృద్ధిని వివరిస్తుంది, అయితే వ్యాసం ఉపయోగకరంగా ఉంటే, డేటాబేస్లో డేటాను నవీకరించడానికి నేను సేవ గురించి వ్రాస్తాను.
ఇది ఏమిటి?
NIFI అనేది డేటా యొక్క వేగవంతమైన సమాంతర లోడ్ మరియు ప్రాసెసింగ్ కోసం పంపిణీ చేయబడిన నిర్మాణం, మూలాలు మరియు రూపాంతరాల కోసం పెద్ద సంఖ్యలో ప్లగిన్లు, కాన్ఫిగరేషన్ల సంస్కరణ మరియు మరెన్నో. ఒక మంచి బోనస్ అది ఉపయోగించడానికి చాలా సులభం. getFile, sendHttpRequest మరియు ఇతరత్రా పనికిమాలిన ప్రక్రియలు స్క్వేర్లుగా సూచించబడతాయి. ప్రతి చతురస్రం ఒక ప్రక్రియను సూచిస్తుంది, దీని పరస్పర చర్య క్రింది చిత్రంలో చూడవచ్చు. ప్రక్రియ సెటప్ పరస్పర చర్యలపై మరింత వివరణాత్మక డాక్యుమెంటేషన్ వ్రాయబడింది
ఒక కథనాన్ని వ్రాయాలనే ఆలోచన సుదీర్ఘ శోధన తర్వాత పుట్టింది మరియు అందుకున్న సమాచారాన్ని స్పృహతో రూపొందించడం, అలాగే భవిష్యత్ డెవలపర్లకు జీవితాన్ని కొద్దిగా సులభతరం చేయాలనే కోరిక.
ఉదాహరణకు
చతురస్రాలు ఒకదానితో ఒకటి ఎలా సంకర్షణ చెందుతాయి అనేదానికి ఉదాహరణగా పరిగణించబడుతుంది. సాధారణ పథకం చాలా సులభం: మేము HTTP అభ్యర్థనను అందుకుంటాము (సిద్ధాంతపరంగా, అభ్యర్థన యొక్క బాడీలో ఫైల్తో. NIFI యొక్క సామర్థ్యాలను ప్రదర్శించడానికి, ఈ ఉదాహరణలో అభ్యర్థన స్థానిక ఫైల్ నిల్వ నుండి ఫైల్ను స్వీకరించే ప్రక్రియను ప్రారంభిస్తుంది. ), ఆపై మేము FH నుండి ఫైల్ను స్వీకరించే ప్రక్రియకు సమాంతరంగా అభ్యర్థన స్వీకరించబడిందని ప్రతిస్పందనను తిరిగి పంపుతాము మరియు దానిని FTP ద్వారా FHకి తరలించే ప్రక్రియ. ఫ్లోఫైల్ అని పిలవబడే ప్రక్రియలు ఒకదానితో ఒకటి సంకర్షణ చెందుతాయని స్పష్టం చేయడం విలువ. NIFIలో ఇది గుణాలు మరియు కంటెంట్ను నిల్వ చేసే మూలాధార సంస్థ. కంటెంట్ అనేది స్ట్రీమ్ ఫైల్ ద్వారా సూచించబడే డేటా. అంటే, స్థూలంగా చెప్పాలంటే, మీరు ఒక స్క్వేర్ నుండి ఫైల్ను స్వీకరించి, మరొకదానికి బదిలీ చేస్తే, కంటెంట్ మీ ఫైల్ అవుతుంది.
మీరు గమనిస్తే, ఈ చిత్రం సాధారణ ప్రక్రియను చూపుతుంది. HandleHttpRequest - అభ్యర్థనలను అంగీకరిస్తుంది, రీప్లేస్టెక్స్ట్ - ప్రతిస్పందన బాడీని ఉత్పత్తి చేస్తుంది, HandleHttpResponse - ప్రతిస్పందనను పంపుతుంది. FetchFile - ఫైల్ నిల్వ నుండి ఫైల్ను అందుకుంటుంది, దాన్ని స్క్వేర్ PutSftpకి బదిలీ చేస్తుంది - ఈ ఫైల్ను పేర్కొన్న చిరునామాలో FTPలో ఉంచుతుంది. ఇప్పుడు ఈ ప్రక్రియ గురించి మరింత.
ఈ సందర్భంలో, అభ్యర్థన ప్రతిదానికీ ప్రారంభం. దాని కాన్ఫిగరేషన్ పారామితులను చూద్దాం.
StandardHttpContextMap మినహా ఇక్కడ ప్రతిదీ చాలా చిన్నవిషయం - ఇది అభ్యర్థనలను పంపడానికి మరియు స్వీకరించడానికి మిమ్మల్ని అనుమతించే ఒక రకమైన సేవ. మరింత వివరంగా మరియు ఉదాహరణలతో కూడా, మీరు చూడవచ్చు -
తరువాత, స్క్వేర్ యొక్క రీప్లేస్టెక్స్ట్ కాన్ఫిగరేషన్ పారామితులను చూద్దాం. రీప్లేస్మెంట్ వాల్యూపై దృష్టి పెట్టడం విలువ - ఇది ప్రతిస్పందన రూపంలో వినియోగదారుకు తిరిగి ఇవ్వబడుతుంది. సెట్టింగ్లలో మీరు లాగింగ్ స్థాయిని సర్దుబాటు చేయవచ్చు, మీరు లాగ్లను {మీరు అన్ప్యాక్ చేసిన nifi}/nifi-1.9.2/లాగ్లను చూడవచ్చు, వైఫల్యం/విజయం పారామితులు కూడా ఉన్నాయి - ఈ పారామితుల ఆధారంగా మీరు మొత్తం ప్రక్రియను నియంత్రించవచ్చు. . అంటే, విజయవంతమైన టెక్స్ట్ ప్రాసెసింగ్ విషయంలో, వినియోగదారుకు ప్రతిస్పందనను పంపే ప్రక్రియ అని పిలుస్తారు మరియు మరొక సందర్భంలో మేము విజయవంతం కాని ప్రక్రియను లాగిన్ చేస్తాము.
ప్రతిస్పందన విజయవంతంగా సృష్టించబడినప్పుడు స్థితి మినహా HandleHttpResponse లక్షణాలలో ప్రత్యేకంగా ఆసక్తికరమైనది ఏమీ లేదు.
మేము అభ్యర్థన మరియు ప్రతిస్పందనను క్రమబద్ధీకరించాము - ఫైల్ని స్వీకరించడానికి మరియు దానిని FTP సర్వర్లో ఉంచడానికి వెళ్దాం. FetchFile - సెట్టింగులలో పేర్కొన్న మార్గంలో ఫైల్ను అందుకుంటుంది మరియు దానిని తదుపరి ప్రక్రియకు పంపుతుంది.
ఆపై PutSftp స్క్వేర్ - ఫైల్ను ఫైల్ నిల్వలో ఉంచుతుంది. మేము దిగువ కాన్ఫిగరేషన్ పారామితులను చూడవచ్చు.
ప్రతి చతురస్రం తప్పనిసరిగా ప్రారంభించబడవలసిన ప్రత్యేక ప్రక్రియ అనే వాస్తవాన్ని దృష్టిలో ఉంచుకోవడం విలువ. సంక్లిష్టమైన అనుకూలీకరణ అవసరం లేని సరళమైన ఉదాహరణను మేము చూశాము. తరువాత, మేము ప్రక్రియను కొంచెం క్లిష్టంగా పరిశీలిస్తాము, ఇక్కడ మేము పొడవైన కమ్మీలపై కొద్దిగా వ్రాస్తాము.
మరింత క్లిష్టమైన ఉదాహరణ
SOAP సందేశాన్ని సవరించే ప్రక్రియ కారణంగా వినియోగదారునికి డేటా బదిలీ సేవ కొంచెం క్లిష్టంగా మారింది. సాధారణ ప్రక్రియ క్రింది చిత్రంలో చూపబడింది.
ఇక్కడ ఆలోచన కూడా ప్రత్యేకంగా సంక్లిష్టంగా లేదు: వినియోగదారు నుండి అతనికి డేటా అవసరమని మేము అభ్యర్థనను అందుకున్నాము, అతను సందేశాన్ని అందుకున్నట్లు ప్రతిస్పందనను పంపాము, ప్రతిస్పందన ఫైల్ను స్వీకరించే ప్రక్రియను ప్రారంభించాము, ఆపై దానిని ఒక నిర్దిష్ట తర్కంతో సవరించాము, ఆపై సర్వర్కు SOAP సందేశం రూపంలో ఫైల్ను వినియోగదారునికి బదిలీ చేసింది.
మనం పైన చూసిన చతురస్రాలను మళ్లీ వివరించాల్సిన అవసరం లేదని నేను భావిస్తున్నాను - నేరుగా కొత్త వాటికి వెళ్దాం. మీరు ఏదైనా ఫైల్ని సవరించాల్సి ఉంటే మరియు సాధారణ రీప్లేస్టెక్స్ట్ రకం చతురస్రాలు సరిపోకపోతే, మీరు మీ స్వంత స్క్రిప్ట్ను వ్రాయవలసి ఉంటుంది. ఇది ExecuteGroogyScript స్క్వేర్ని ఉపయోగించి చేయవచ్చు. దీని సెట్టింగ్లు క్రింద ప్రదర్శించబడ్డాయి.
ఈ స్క్వేర్లోకి స్క్రిప్ట్ను లోడ్ చేయడానికి రెండు ఎంపికలు ఉన్నాయి. మొదటిది స్క్రిప్ట్తో ఫైల్ను డౌన్లోడ్ చేయడం. రెండవది స్క్రిప్ట్బాడీలో స్క్రిప్ట్ను చొప్పించడం. నాకు తెలిసినంతవరకు, ఎగ్జిక్యూట్స్క్రిప్ట్ స్క్వేర్ అనేక భాషలకు మద్దతు ఇస్తుంది - వాటిలో ఒకటి గ్రూవీ. నేను జావా డెవలపర్లను నిరాశపరుస్తాను - మీరు అలాంటి స్క్వేర్లలో జావాలో స్క్రిప్ట్లను వ్రాయలేరు. నిజంగా కోరుకునే వారి కోసం, మీరు మీ స్వంత కస్టమ్ స్క్వేర్ని సృష్టించి, దానిని NIFI సిస్టమ్కు జోడించాలి. ఈ మొత్తం ఆపరేషన్ టాంబురైన్తో చాలా పొడవైన నృత్యంతో కూడి ఉంటుంది, ఈ వ్యాసంలో మేము వ్యవహరించము. నేను గ్రూవీ భాషను ఎంచుకున్నాను. SOAP మెసేజ్లో ఐడిని మరింతగా అప్డేట్ చేసే టెస్ట్ స్క్రిప్ట్ క్రింద ఉంది. ఇది గమనించడం ముఖ్యం. మీరు ఫ్లోఫైల్ నుండి ఫైల్ను తీసుకొని దాన్ని అప్డేట్ చేయండి, మీరు దానిని తిరిగి అక్కడ ఉంచాలని మర్చిపోకండి, నవీకరించబడింది. అన్ని లైబ్రరీలు చేర్చబడలేదు అని కూడా గమనించాలి. మీరు ఇప్పటికీ లిబ్లలో ఒకదాన్ని దిగుమతి చేసుకోవలసి ఉంటుంది. మరొక ప్రతికూలత ఏమిటంటే, ఈ స్క్వేర్లోని స్క్రిప్ట్ డీబగ్ చేయడం చాలా కష్టం. NIFI JVMకి కనెక్ట్ చేయడానికి మరియు డీబగ్గింగ్ ప్రక్రియను ప్రారంభించడానికి ఒక మార్గం ఉంది. వ్యక్తిగతంగా, నేను స్థానిక అప్లికేషన్ను ప్రారంభించాను మరియు సెషన్ నుండి ఫైల్ను స్వీకరించడాన్ని అనుకరించాను. స్థానికంగా డీబగ్గింగ్ కూడా చేశాను. స్క్రిప్ట్ను లోడ్ చేస్తున్నప్పుడు కనిపించే లోపాలు Googleకి చాలా సులభం మరియు లాగ్లో NIFI ద్వారా వ్రాయబడతాయి.
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)
}
వాస్తవానికి, స్క్వేర్ యొక్క అనుకూలీకరణ ఇక్కడే ముగుస్తుంది. తరువాత, నవీకరించబడిన ఫైల్ స్క్వేర్కు బదిలీ చేయబడుతుంది, ఇది ఫైల్ను సర్వర్కు పంపడానికి బాధ్యత వహిస్తుంది. ఈ స్క్వేర్ కోసం సెట్టింగ్లు క్రింద ఉన్నాయి.
SOAP సందేశం ప్రసారం చేయబడే పద్ధతిని మేము వివరిస్తాము. మేము ఎక్కడ వ్రాస్తాము. తదుపరి మీరు ఇది SOAP అని సూచించాలి.
హోస్ట్ మరియు యాక్షన్ (soapAction) వంటి అనేక లక్షణాలను జోడించండి. మేము సేవ్ చేసి తనిఖీ చేస్తాము. మీరు SOAP అభ్యర్థనలను ఎలా పంపాలనే దానిపై మరిన్ని వివరాలను చూడవచ్చు
మేము NIFI ప్రక్రియలను ఉపయోగించడం కోసం అనేక ఎంపికలను పరిశీలించాము. వారు ఎలా పరస్పర చర్య చేస్తారు మరియు వారి నిజమైన ప్రయోజనం ఏమిటి? పరిగణించబడిన ఉదాహరణలు పరీక్షాపరమైనవి మరియు వాస్తవానికి పోరాటంలో జరిగే వాటికి కొద్దిగా భిన్నంగా ఉంటాయి. ఈ వ్యాసం డెవలపర్లకు కొంచెం ఉపయోగకరంగా ఉంటుందని నేను ఆశిస్తున్నాను. మీరు ఆసక్తి చూపినందుకు ధన్యవాదములు. మీకు ఏవైనా ప్రశ్నలు ఉంటే, వ్రాయండి. నేను సమాధానం చెప్పడానికి ప్రయత్నిస్తాను.
మూలం: www.habr.com