Ko nga mahi tukatuka ano i riro mai i a Kafka

Ko nga mahi tukatuka ano i riro mai i a Kafka

Kia ora, Habr.

I tata nei ahau i whakapuaki i tona wheako mo nga tawhā e whakamahia ana e matou he roopu mo Kafka Producer me te Kaihokohoko kia tata atu ki te tuku taurangi. I roto i tenei tuhinga e hiahia ana ahau ki te korero ki a koe me pehea ta matou whakarite i te tukatuka ano i tetahi huihuinga i whakawhiwhia mai i Kafka na te kore o te waatea o te punaha o waho.

Ko nga tono hou e mahi ana i roto i te taiao tino uaua. Ko te arorau pakihi kua takai ki roto i te putunga hangarau hou, e rere ana i roto i te ahua Docker e whakahaeretia ana e tetahi kaikorero penei i a Kubernetes, OpenShift ranei, me te korero ki etahi atu tono, otinga hinonga ranei na roto i te mekameka o nga pouara tinana me te mariko. I roto i te taiao penei, ka pakaru tonu tetahi mea, na reira ko te tukatuka ano i nga huihuinga mena karekau tetahi o nga punaha o waho he waahanga nui o a maatau mahi pakihi.

Pehea i mua i a Kafka

I mua o te kaupapa i whakamahia e matou te IBM MQ mo te tuku karere tukutahi. Mena i puta he hapa i te wa e whakahaere ana te ratonga, ka taea te tuku i te karere kua tae mai ki roto i te rarangi-reta-tutira (DLQ) mo etahi atu porotiti a-ringa. I hangaia te DLQ ki te taha o te rarangi taumai, i whakawhitia te karere ki roto IBM MQ.

Mena he wa poto te hapa ka taea e matou te whakatau (hei tauira, he ResourceAccessException i runga i te waea HTTP, i te MongoTimeoutException ranei i runga i te tono MongoDb), ka whai mana te rautaki ngana ano. Ahakoa te arorau peka o te tono, i nukuhia te karere taketake ki te rarangi punaha mo te wa roa te tuku, ki tetahi tono motuhake i mahia i mua noa atu hei tuku ano i nga karere. Kei roto i tenei ko te nama tuku ano i roto i te pane o te karere, kua herea ki te waahi whakaroa, ki te mutunga ranei o te rautaki taumata-tono. Mena kua tae tatou ki te mutunga o te rautaki engari kaore i te waatea te punaha o waho, katahi ka tukuna te karere ki roto i te DLQ mo te panui a-ringa.

Rangahau rapu

Te rapu i runga i te Ipurangi, ka kitea e koe nga mea e whai ake nei решение. I te poto, ka whakaarohia kia hanga he kaupapa mo ia waahi whakaroa me te whakatinana i nga tono Kaihoko i te taha, ka panui nga panui me te wa roa e hiahiatia ana.

Ko nga mahi tukatuka ano i riro mai i a Kafka

Ahakoa te maha o nga arotake pai, ki ahau nei kaore i tino angitu. Tuatahi, na te mea ko te kaiwhakawhanake, i tua atu i te whakatinana i nga whakaritenga pakihi, me whakapau kaha ki te whakatinana i te tikanga kua whakaahuatia.

I tua atu, ki te whakahohea te mana uru ki runga i te roopu Kafka, me noho koe ki te hanga kaupapa me te whakarato i te urunga e tika ana ki a raatau. I tua atu i tenei, me kowhiria e koe te tawhā pupuri.ms tika mo ia kaupapa ngana ano kia whai taima nga karere kia kore e ngaro atu. Ko te whakatinanatanga me te tono urunga me whakahoki ano mo ia ratonga o mua, hou ranei.

Inaianei kia kite tatou he aha nga tikanga o te puna i te nuinga o te waa me te puna-kafka e whakarato ana ki a tatou mo te tukatuka karere. Ko te puna-kafka he ti'aturi tauwhiro ki te ngana ano i te puna, e whakarato ana i nga tangohanga mo te whakahaere i nga momo BackOffPolicies. He taputapu tino ngawari tenei, engari ko tana raru nui ko te penapena i nga karere mo te tuku ano i roto i te mahara tono. Ko te tikanga ko te whakaara ano i te tono na te mea he whakahou, he hapa whakahaere ranei ka ngaro nga karere katoa e tatari ana ki te tukatuka ano. I te mea he mea tino nui tenei waahanga mo ta maatau punaha, kaore i whakaarohia e maatau.

Ko te puna-kafka ake e whakarato ana i etahi whakatinanatanga o ContainerAwareErrorHandler, hei tauira SeekToCurrentErrorHandler, ka taea e koe te tukatuka i te karere a muri ake nei me te kore e huri i te whakanekeneke inaa he hapa. I timata mai i te putanga o te puna-kafka 2.3, ka taea te whakatakoto BackOffPolicy.

Ma tenei huarahi ka taea e nga karere kua tukatukahia kia ora i te tiimata ano o te tono, engari karekau he tikanga DLQ. I whiriwhiria e matou tenei whiringa i te timatanga o te tau 2019, me te tino whakapono karekau e hiahiatia te DLQ (he waimarie matou, a, kaore i hiahiatia i muri i nga marama maha o te whakahaere i te tono me taua punaha tukatuka). Na nga hapa rangitahi i pa ai a SeekToCurrentErrorHandler. Ko nga hapa e toe ana i taia ki roto i te raarangi, ka puta he waahi, ka haere tonu te tukatuka me te karere e whai ake nei.

Te whakatau whakamutunga

Ko te whakatinanatanga i runga i SeekToCurrentErrorHandler i akiaki i a maatau ki te whakawhanake i a maatau ake tikanga mo te tuku karere.

Tuatahi, i hiahia matou ki te whakamahi i te wheako o naianei me te whakawhānui ake i runga i te arorau tono. Mo te tono arorau rarangi, he mea pai kia mutu te panui i nga karere hou mo te wa poto kua tohua e te rautaki ngana ano. Mo etahi atu tono, i pirangi au ki te whai i tetahi tohu hei whakamana i te rautaki ngana ano. I tua atu, me whai mahi DLQ tenei tohu kotahi mo nga huarahi e rua.

Ko te rautaki ngana ano me penapena ki roto i te tono, kei a ia te kawenga mo te whakahoki mai i te waa e whai ake nei ina puta he hapa rangitahi.

Whakamutua te Kaihoko mo te Taupānga Ararau Raina

I te wa e mahi ana me te puna-kafka, he penei te ahua o te waehere hei aukati i te Kaihoko:

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

Hei tauira, ko te retryAt te wa ki te whakaara ano i te MessageListenerContainer mena kei te haere tonu. Ko te whakarewatanga ano ka puta i roto i tetahi miro motuhake i whakarewahia i roto i te TaskScheduler, ko te whakatinanatanga ka tukuna ano e te puna.

Ka kitea e matou te uara retryAt penei:

  1. Ka tirohia ake te uara o te porotiti karanga.
  2. I runga i te uara porotiti, ka rapua te waahi whakaroa i roto i te rautaki ngana ano. Ko te rautaki i whakapuakihia i roto i te tono ake; i whiriwhiria e matou te whakatakotoranga JSON hei penapena.
  3. Ko te waahi ka kitea i roto i te raupapa JSON kei ​​roto te maha o nga hēkona i muri i te tukatuka me tukurua. Ka taapirihia tenei maha o nga hēkona ki te wa o naianei hei hanga i te uara mo te retryAt.
  4. Mena kaore i kitea te waahi, ka kore te uara o te retryAt ka tukuna te karere ki te DLQ mo te poroporo a-ringa.

Ma tenei huarahi, ko nga mea e toe ana ko te penapena i te maha o nga waea tukurua mo ia karere e whakahaerea ana i tenei wa, hei tauira i te mahara tono. Ko te pupuri i te tatau ngana ano i roto i te mahara ehara i te mea nui mo tenei huarahi, na te mea kaore e taea e te tono arorau rarangi te whakahaere i te katoa o te tukatuka. Kaore i rite ki te ngana ano i te puna, ko te whakaara ano i te tono ka kore e ngaro nga karere katoa ki te tukatuka ano, engari ka timata ano te rautaki.

Ka awhina tenei huarahi ki te tango i te kawenga mai i te punaha o waho, kaore pea i te waatea na te taumaha rawa o te kawenga. Arā, i tua atu i te tukatuka anō, i tutuki i a mātou te whakatinanatanga o te tauira wehenga porowhita.

I roto i a maatau, ko te paepae hapa he 1 anake, me te whakaiti i te wa paheketanga o te punaha na te korenga o te whatunga rangitahi, ka whakamahia e matou he rautaki ngana ano me nga waahi iti. Kaore pea tenei e pai mo nga tono roopu katoa, na reira me whiriwhiri te hononga i waenga i te paepae hapa me te uara waahi i runga i nga ahuatanga o te punaha.

He tono motuhake mo te tukatuka karere mai i nga tono me te arorau kore-whakarite

Anei tetahi tauira o te waehere e tuku karere ana ki taua tono (Kaiwhakahou), ka tukuna ano ki te kaupapa DESTINATION ina tae ki te wa RETRY_AT:


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);
    }

Ko te tauira e whakaatu ana he maha nga korero ka tukuna i roto i nga pane. Ko te uara o RETRY_AT ka kitea he rite tonu ki te tikanga mo te ngana ano ma te aukati Kaihoko. I tua atu ki DESTINATION me RETRY_AT ka paahitia e matou:

  • GROUP_ID, ma reira ka whakarōpū karere mo te tātari a-ringa me te rapu ngawari.
  • ORIGINAL_PARTITION ki te ngana ki te pupuri i taua Kaihoko mo te tukatuka ano. Ka taea te whakakore i tenei tawhā, i roto i tenei take ka whiwhi te wehewehenga hou ma te whakamahi i te record.key() o te karere taketake.
  • Kua whakahoutia te uara COUNTER hei whai i te rautaki ngana ano.
  • Ko te SEND_TO he tohu tonu mena ka tukuna te karere hei tukatuka ano ina tae ki RETRY_AT, ka tuu ranei ki DLQ.
  • TE WHAKAMAHI - te take i haukotia ai te tukatuka karere.

Ka penapenahia nga karere a Retryer mo te tuku ano me te poroporo a-ringa ki PostgreSQL. Ka timata te taima i tetahi mahi ka kitea nga karere me RETRY_AT ka whakahokia ki te wehenga ORIGINAL_PARTITION o te kaupapa DESTINATION me te record.key().

Ina tukuna, ka mukua nga karere mai i te PostgreSQL. Ko te poroporoaki a-ringa o nga karere ka puta i roto i te UI ngawari e mahi tahi ana me te Kai-whakahou ma te REST API. Ko ona ahuatanga matua ko te tuku, te whakakore ranei i nga karere mai i te DLQ, te tiro i nga korero hapa me te rapu karere, hei tauira ma te ingoa hapa.

I te mea kua whakahohea te mana uru ki runga i a tatou tautau, me tono taapiri mo te kaupapa e whakarongo ana a Retryer, me te tuku a Retryer ki te tuhi ki te kaupapa DESTINATION. He maamaa tenei, engari, kaore i rite ki te huarahi kaupapa mo te waahi, kei a maatau te DLQ me te UI ki te whakahaere.

He keehi ka panuihia tetahi kaupapa taumai e te maha o nga roopu kaihoko rereke, na o raatau tono ka whakatinana i nga whakaaro rereke. Ko te tukatuka ano i tetahi karere na roto i te Kai-whakahou mo tetahi o enei tono ka puta he taarua ki tetahi atu. Hei whakamarumaru i tenei, ka hangaia e matou he kaupapa motuhake mo te tukatuka ano. Ka taea e te Kaihokohoko te panui nga kaupapa taumai me te ngana ano me te kore he here.

Ko nga mahi tukatuka ano i riro mai i a Kafka

Ma te taunoa karekau tenei huarahi e whakarato i te taumahinga wehenga ara iahiko, heoi ka taea te taapiri atu ki te tono ma te whakamahi puna-kapua-netflix hou ranei puna iahiko kapua iahiko, te takai i nga waahi ka karangahia nga ratonga o waho ki nga tangohanga tika. I tua atu, ka taea te whiriwhiri rautaki mo Tuhinga o mua tauira, ka taea hoki te whai hua. Hei tauira, i te puna-kapua-netflix he puna miro, he semaphore ranei.

mutunga

Ko te mutunga mai, he tono motuhake ta matou ka taea e matou te whakahoki ano i te tukatuka karere mena karekau he punaha o waho mo te wa poto.

Ko tetahi o nga painga nui o te tono ka taea te whakamahi e nga punaha o waho e rere ana i runga i te roopu Kafka kotahi, kaore he whakarereketanga nui i to raatau taha! Ko te tono pera me uru ki te kaupapa ngana ano, whakakiia etahi pane Kafka ka tukuna he karere ki te Kaipupuri. Kaore he take ki te whakaara i etahi atu hanganga. A, hei whakaiti i te maha o nga karere i whakawhitia mai i te tono ki te Retryer me te hoki, i tautuhia e matou nga tono me te arorau rarangi me te tukatuka ano i a raatau ma te aukati Kaihoko.

Source: will.com

Tāpiri i te kōrero