Ukuhlaziya iziganeko ezifunyenwe kwi-Kafka

Ukuhlaziya iziganeko ezifunyenwe kwi-Kafka

Molo, Habr.

Kutshanje I wabelane ngamava akhe malunga nokuba zeziphi iiparamitha thina njengeqela esihlala sizisebenzisela uMvelisi weKafka kunye noMthengi ukusondela kunikezelo oluqinisekisiweyo. Kweli nqaku ndifuna ukukuxelela indlela esilungiselele ngayo ukuphinda kuqhutywe isiganeko esifunyenwe kwi-Kafka ngenxa yokungafumaneki kwesikhashana kwenkqubo yangaphandle.

Izicelo zanamhlanje zisebenza kwindawo enzima kakhulu. Ingqiqo yeshishini esongelwe kwisitaki sobuchwephesha bale mihla, esebenza kumfanekiso we-Docker olawulwa yi-orchestrator efana ne-Kubernetes okanye i-OpenShift, kunye nokunxibelelana nezinye izicelo okanye izisombululo zeshishini ngothotho lweerotha ezibonakalayo kunye nenyani. Kwimeko enjalo, into enokuthi ihlale iphuka, ngoko ke ukuhlaziya iziganeko ukuba enye yeenkqubo zangaphandle ayifumaneki yinxalenye ebalulekileyo yeenkqubo zethu zoshishino.

Kwakunjani ngaphambi kweKafka

Ngaphambili kwiprojekthi sasebenzisa i-IBM MQ yokuhanjiswa komyalezo ongavumelaniyo. Ukuba kwenzeke nayiphi na impazamo ngexesha lokusebenza kwenkonzo, umyalezo ofunyenweyo unokubekwa kwi-dead-letter-queue (DLQ) ukwenzela ucazululo olungakumbi ngesandla. I-DLQ idalwe ecaleni komgca ongenayo, umyalezo udluliselwe ngaphakathi kwe-IBM MQ.

Ukuba impazamo ibiyeyomzuzwana kwaye besinokuyimisela (umzekelo, iResourceAccessException kumnxeba weHTTP okanye iMongoTimeoutException kwisicelo se-MongoDb), icebo lokuzama kwakhona liya kusebenza. Nokuba yeyiphi ingqiqo yesebe yesicelo, umyalezo wokuqala usiwe mhlawumbi kumgca wendlela yokulibaziseka ukuthunyelwa, okanye kwisicelo esahlukileyo esenziwe kudala ukuthumela kwakhona imiyalezo. Oku kuquka inombolo yokuthumela kwakhona kwi-header yomyalezo, ebotshelelwe kwixesha lokulibaziseka okanye ekupheleni kwesicwangciso somgangatho wesicelo. Ukuba sifikelele esiphelweni sesicwangciso kodwa inkqubo yangaphandle ayikafumaneki, ngoko umyalezo uya kufakwa kwi-DLQ ukuze uhlalutyelwe ngesandla.

Ukufumana isisombululo

Ukukhangela kwi-Intanethi, ungafumana oku kulandelayo isigqibo. Ngamafutshane, kucetywayo ukudala isihloko kwithuba lokulibaziseka ngalinye kwaye kuphunyezwe izicelo zoMthengi kwicala, eliya kufunda imiyalezo ngokulibaziseka okufunekayo.

Ukuhlaziya iziganeko ezifunyenwe kwi-Kafka

Ngaphandle kwenani elikhulu lokuphononongwa okuhle, kubonakala kum ayiphumelelanga ngokupheleleyo. Okokuqala, kuba umphuhlisi, ngaphezu kokuphumeza iimfuno zoshishino, kuya kufuneka achithe ixesha elininzi ekuphumezeni indlela echazwe ngayo.

Ukongeza, ukuba ulawulo lofikelelo luvuliwe kwiqela le-Kafka, kuya kufuneka uchithe ixesha elithile udala izihloko kunye nokubonelela ukufikelela okuyimfuneko kubo. Ukongeza koku, kuya kufuneka ukhethe i parameter echanekileyo yogcino.ms kwisihloko ngasinye uzame kwakhona ukuze imiyalezo ibe nexesha lokuphinda ithunyelwe kwaye inganyamalali kuyo. Ukuphunyezwa kunye nesicelo sokufikelela kuya kufuneka kuphindwe kwinkonzo nganye ekhoyo okanye entsha.

Ngoku makhe sibone ukuba zeziphi iindlela zentwasahlobo ngokubanzi kunye ne-spring-kafka ezisibonelela ngokukhethekileyo malunga nokuphinda kuhlaziywe umyalezo. I-Spring-kafka inokuxhomekeka kwi-transitive kwi-spring-try kwakhona, ebonelela ngokutsalwa kokulawula ii-BackOffPolicies ezahlukeneyo. Esi sisixhobo esibhetyebhetye ngokufanelekileyo, kodwa i-drawback yayo ebalulekileyo kukugcina imiyalezo yokuthunyelwa kwakhona kwimemori yesicelo. Oku kuthetha ukuba ukuqalisa kwakhona usetyenziso ngenxa yohlaziyo okanye impazamo yokusebenza kuya kukhokelela ekuphulukaneni nayo yonke imiyalezo elindele ukusetyenzwa kwakhona. Kuba le ngongoma ibalulekile kwinkqubo yethu, asikhange siyiqwalasele ngokubhekele phaya.

intwasahlobo-kafka ngokwayo ibonelela ngokusetyenziswa okuliqela kweContainerAwareErrorHandler, umzekelo SeekToCurrentErrorHandler, apho unokuqhubekekisa khona umyalezo emva kwexesha ngaphandle kokutshintsha ioffset xa kukho impazamo. Ukuqala ngoguqulelo lwe-spring-kafka 2.3, kuye kwenzeka ukuseta i-BackOffPolicy.

Le ndlela ivumela imiyalezo ehlaziyiweyo ukuba iphile xa kuphinda kuqalwa isicelo, kodwa akukabikho matshini we-DLQ. Sakhetha olu khetho ekuqaleni kuka-2019, sikholelwa ngethemba lokuba i-DLQ ayizukufuneka (sasinethamsanqa kwaye asizange siyifune emva kweenyanga ezininzi zokusebenza kwesicelo ngenkqubo enjalo yokuhlaziya kwakhona). Iimpazamo zexeshana zibangele ukuba iSeekToCurrentErrorHandler itshise. Iimpazamo eziseleyo zaprintwa kwilog, zikhokelela kwi-offset, kwaye ukuqhubekeka kuqhubeke nomyalezo olandelayo.

Isigqibo sokugqibela

Ukuphunyezwa okusekwe kwiSeekToCurrentErrorHandler kusikhuthaze ukuba siphuhlise eyethu indlela yokuthumela kwakhona imiyalezo.

Okokuqala, besifuna ukusebenzisa amava akhoyo kwaye sandise ngokuxhomekeke kwingqiqo yesicelo. Kwisicelo esinengqiqo yomgca, iya kuba yinto elungileyo ukuyeka ukufunda imiyalezo emitsha ngexesha elifutshane elichazwe sisicwangciso sokuzama kwakhona. Kwezinye izicelo, bendifuna ukuba nenqaku elinye eliza kunyanzelisa isicwangciso sokuphinda sizame. Ukongeza, eli nqaku elinye kufuneka libe nokusebenza kwe-DLQ kuzo zombini iindlela.

Isicwangciso sokuphinda sizame ngokwaso kufuneka sigcinwe kwisicelo, esinoxanduva lokufumana kwakhona ikhefu elilandelayo xa kusenzeka impazamo yexeshana.

Ukumisa uMthengi kwiSicelo esiQinisekileyo esineNgqiqo

Xa usebenza nge-spring-kafka, ikhowudi yokumisa uMthengi inokujongeka ngolu hlobo:

public void pauseListenerContainer(MessageListenerContainer listenerContainer, 
                                   Instant retryAt) {
        if (nonNull(retryAt) && listenerContainer.isRunning()) {
            listenerContainer.stop();
            taskScheduler.schedule(() -> listenerContainer.start(), retryAt);
            return;
        }
        // to DLQ
    }

Kumzekelo, i-retryAt lixesha lokuphinda uqalise i-MessageListenerContainer ukuba isasebenza. Ukuqaliswa kwakhona kuya kwenzeka kwintambo eyahlukileyo eqaliswe kwi-TaskScheduler, ukuphunyezwa kwayo kubonelelwe ngentwasahlobo.

Sifumana ixabiso le-retryAt ngale ndlela ilandelayo:

  1. Ixabiso lekhawuntara yokubiza kwakhona lijongwe phezulu.
  2. Ngokusekelwe kwixabiso lekhawuntari, ixesha lokulibaziseka langoku kwiqhinga lokuphinda likhangelwe. Isicwangciso sibhengezwe kwisicelo ngokwaso; sikhethe ifomati ye-JSON ukuyigcina.
  3. Ithuba lokuphumla elifunyenwe kuluhlu lwe-JSON liqulathe inani lemizuzwana emva kokuba inkqubo iya kufuneka iphindwe. Eli nani lemizuzwana longezwa kwixesha langoku ukwenza ixabiso lokuzama kwakhona.
  4. Ukuba ixesha lokuphumla alifunyenwanga, ngoko ke ixabiso lokuzama kwakhona aliyiyo kwaye umyalezo uya kuthunyelwa kwi-DLQ ukuze kucazululwe ngesandla.

Ngale ndlela, konke okuseleyo kukugcina inani leefowuni eziphindaphindiweyo kumyalezo ngamnye oqhutyelwayo ngoku, umzekelo kwimemori yesicelo. Ukugcina ubalo lokuphinda uzame kwinkumbulo akubalulekanga kule ndlela, kuba isicelo esinengqiqo singenako ukuphatha inkqubo xa iyonke. Ngokungafaniyo nokuzama kwakhona entwasahlobo, ukuqalisa kwakhona usetyenziso akuyi kubangela ukuba yonke imiyalezo ilahleke ukuba iphinde iqhutyelwe, kodwa iya kuqalisa kwakhona isicwangciso.

Le ndlela inceda ukususa umthwalo kwinkqubo yangaphandle, enokuthi ingabikho ngenxa yomthwalo onzima kakhulu. Ngamanye amazwi, ukongeza kwi-reprocessing, siphumelele ukuphunyezwa kwepateni umephuli wojikelezo.

Kwimeko yethu, umda wephutha ngu-1 kuphela, kunye nokunciphisa ixesha lokunciphisa inkqubo ngenxa yokuphela kwenethiwekhi yexeshana, sisebenzisa isicwangciso sokuphinda sisebenzise i-granular kunye nezithuba ezincinci zokulinda. Oku kusenokungafaneleki kuzo zonke izicelo zeqela, ngoko ke ubudlelwane phakathi komda wempazamo kunye nexabiso lekhefu kufuneka kukhethwe ngokusekelwe kwiimpawu zenkqubo.

Isicelo esahlukileyo sokuqhubekeka kwemiyalezo evela kwizicelo ezinengqiqo engamiselwanga

Nanku umzekelo wekhowudi ethumela umyalezo kwisicelo esinjalo (Phinda uzame), oza kuthumela kwakhona kwi-DESTINATION isihloko xa i-RETRY_AT ixesha lifikile:


public <K, V> void retry(ConsumerRecord<K, V> record, String retryToTopic, 
                         Instant retryAt, String counter, String groupId, Exception e) {
        Headers headers = ofNullable(record.headers()).orElse(new RecordHeaders());
        List<Header> arrayOfHeaders = 
            new ArrayList<>(Arrays.asList(headers.toArray()));
        updateHeader(arrayOfHeaders, GROUP_ID, groupId::getBytes);
        updateHeader(arrayOfHeaders, DESTINATION, retryToTopic::getBytes);
        updateHeader(arrayOfHeaders, ORIGINAL_PARTITION, 
                     () -> Integer.toString(record.partition()).getBytes());
        if (nonNull(retryAt)) {
            updateHeader(arrayOfHeaders, COUNTER, counter::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "retry"::getBytes);
            updateHeader(arrayOfHeaders, RETRY_AT, retryAt.toString()::getBytes);
        } else {
            updateHeader(arrayOfHeaders, REASON, 
                         ExceptionUtils.getStackTrace(e)::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "backout"::getBytes);
        }
        ProducerRecord<K, V> messageToSend =
            new ProducerRecord<>(retryTopic, null, null, record.key(), record.value(), arrayOfHeaders);
        kafkaTemplate.send(messageToSend);
    }

Umzekelo ubonisa ukuba ulwazi oluninzi luhanjiswa kwizihloko. Ixabiso le-RETRY_AT lifunyanwa ngendlela efanayo nendlela yokuzama kwakhona kwi-Consumer stop. Ukongeza kwi-DESTINATION kunye ne-RETRY_AT siyadlula:

  • GROUP_ID, apho sidibanisa imiyalezo ukuze sihlalutywe ngesandla kunye nokukhangela lula.
  • ORIGINAL_PARTITION ukuzama ukugcina uMthengi ofanayo ukusetyenzwa kwakhona. Le parameter inokuba lilize, apho isahlulelo esitsha siyakufunyanwa kusetyenziswa irekhodi.key() isitshixo somyalezo wokuqala.
  • Ihlaziywe COUNTER ixabiso lokulandela iqhinga lokuphinda uzame.
  • SEND_TO isoloko ibonisa ukuba umyalezo uthunyelwe ukuba uphinde uhlaziywe xa ufika RETRY_AT okanye ubekwe kwi-DLQ.
  • ISIZATHU - isizathu sokuba ukuhanjiswa komyalezo kuphazamiseke.

Ukuzama kwakhona ukugcina imiyalezo yokuthunyelwa kwakhona kunye nokwahlulahlula ngesandla kwi-PostgreSQL. Isibali-xesha siqala umsebenzi ofumana imiyalezo nge RETRY_AT kwaye iyithumele emva kwi ORIGINAL_PARTITION isahlulelo sesihloko se DESTINATION nesitshixo record.key().

Nje ukuba ithunyelwe, imiyalezo iyacinywa kwiPostgreSQL. Ukwahlulwahlulwa ngesandla kwemiyalezo kwenzeka kwi-UI elula enxibelelana neRetryer nge-REST API. Iimpawu zayo eziphambili zithumela kwakhona okanye zicima imiyalezo kwi-DLQ, ukujonga ulwazi lwephutha kunye nokukhangela imiyalezo, umzekelo ngegama lephutha.

Kuba ulawulo lofikelelo luvuliwe kumaqela ethu, kuyafuneka ukuba ukongeza ucele ufikelelo kwisihloko eso uRemayo uphinde amamele, kwaye uvumele u-Remay kwakhona ukuba abhalele kwisihloko se-DESTINATION. Oku akuncedi, kodwa, ngokungafaniyo nendlela yesihloko sekhefu, sine-DLQ epheleleyo kunye ne-UI ukuyilawula.

Kukho iimeko xa isihloko esingenayo sifundwa ngamaqela amaninzi ahlukeneyo abathengi, abazicelo zabo zisebenzisa ingqiqo eyahlukileyo. Ukusetyenzwa kwakhona komyalezo ngeZama kwakhona kwenye yezi zicelo kuya kubangela ukuphinda-phinda kwenye. Ukukhusela kule nto, senza isihloko esahlukileyo sokulungiswa kwakhona. Izihloko ezingenayo kwaye uzame kwakhona zinokufundwa nguMthengi ofanayo ngaphandle kwezithintelo.

Ukuhlaziya iziganeko ezifunyenwe kwi-Kafka

Ngokungagqibekanga le ndlela ayiboneleli ngokusebenza kwe-circuit breaker, nangona kunjalo inokongezwa kwisicelo usebenzisa intwasahlobo-ilifu-netflix okanye entsha i-spring cloud cloud circuit breaker, ukusonga iindawo apho iinkonzo zangaphandle zibizelwa kwizithinteli ezifanelekileyo. Ukongeza, kunokwenzeka ukuba ukhethe isicwangciso inqwaba iphethini, enokuba luncedo. Ngokomzekelo, kwi-spring-cloud-netflix le nto ingaba yiphuli yentambo okanye i-semaphore.

isiphelo

Ngenxa yoko, sinesicelo esahlukileyo esivumela ukuba siphinde ukusetyenzwa komyalezo ukuba nayiphi na inkqubo yangaphandle ayifumaneki okwethutyana.

Enye yeenzuzo eziphambili zesicelo kukuba ingasetyenziselwa iinkqubo zangaphandle ezisebenza kwiqela elifanayo leKafka, ngaphandle kokuguqulwa okubalulekileyo kwicala labo! Isicelo esinjalo siya kufuna kuphela ukufikelela kwisihloko sokuzama kwakhona, gcwalisa iiheader ezimbalwa ze-Kafka kwaye uthumele umyalezo kwi-Retryer. Akukho mfuneko yokunyusa naziphi na iziseko zoncedo ezongezelelweyo. Kwaye ukuze kuncitshiswe inani lemiyalezo ekhutshelwe kwisicelo iRema kwakhona kunye nomva, sichonge usetyenziso olunengqiqo yomgca saza saphinda saqhubekeka ngokuyeka uMthengi.

umthombo: www.habr.com

Yongeza izimvo