Nahea a Kafka i tino pono ai

Nahea a Kafka i tino pono ai

Hei Habr!

Kei te mahi ahau i te roopu Tinkoff, kei te whakawhanake i tana ake pokapū panui. Ko te nuinga o taku whakawhanake i Java ma te whakamahi i te Spring boot me te whakaoti i nga momo raru hangarau ka puta mai i tetahi kaupapa.

Ko te nuinga o a maatau ratonga moroiti e korero ana ki a raatau ano ma te kaihokohoko karere. I mua, i whakamahia e matou a IBM MQ hei kaihokohoko, kaore e kaha ki te whakatutuki i te kawenga, engari i te wa ano he nui nga taurangi tuku.

Hei whakakapinga, i tukuna mai ki a matou a Apache Kafka, he nui te kaha o te tauine, engari, ko te mate, me whai huarahi tata takitahi ki te whirihoranga mo nga ahuatanga rereke. I tua atu, ko te tikanga tuku i te wa kotahi e mahi ana i Kafka ma te taunoa kaore i whakaae ki te pupuri i te taumata e tika ana kia rite ki waho o te pouaka. I muri mai, ka tohatohahia e ahau o maatau wheako i roto i te whirihoranga Kafka, ina koa, ka korero atu ahau ki a koe me pehea te whirihora me te noho me te tuku kotahi.

Te tuku whakamana me te maha atu

Ko nga tautuhinga e korerohia ana i raro nei ka awhina i te maha o nga raruraru me nga tautuhinga hononga taunoa. Engari ko te tuatahi ka hiahia ahau ki te aro ki tetahi tawhā e pai ai te mahi patuiro.

Ka awhina tenei kiritaki.id mo te Kaihanga me te Kaihoko. I te titiro tuatahi, ka taea e koe te whakamahi i te ingoa tono hei uara, a, i te nuinga o te waa ka mahi tenei. Ahakoa te ahuatanga ka whakamahia e tetahi tono te maha o nga Kaihoko ka hoatu e koe te client.id kotahi, ka puta ko te whakatupato e whai ake nei:

org.apache.kafka.common.utils.AppInfoParser — Error registering AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0

Mena kei te pirangi koe ki te whakamahi i te JMX ki tetahi tono me Kafka, ka raru pea tenei. Mo tenei keehi, he pai ake te whakamahi i te huinga o te ingoa tono me, hei tauira, te ingoa kaupapa hei uara client.id. Ko te hua o ta maatau whirihoranga ka kitea i roto i te putanga whakahau kafka-kaihoko-rōpū mai i nga taputapu mai i Confluent:

Nahea a Kafka i tino pono ai

Inaianei me titiro tatou ki te ahuatanga mo te tuku karere pono. He tawhā a Kafka Producer acks, e taea ai e koe te whirihora i muri i te maha o nga kaikorero me whakaaro te kaihautu roopu kia pai te tuhi o te karere. Ka taea e tenei tawhā te tango i nga uara e whai ake nei:

  • 0 — kare e whakaarohia te whakaae.
  • Ko te 1 te tawhā taunoa, 1 anake te tauira e hiahiatia ana hei whakaae.
  • −1 — me whakaae mai i nga tauira tukutahi katoa e hiahiatia ana (te huinga huinga min.insync.replicas).

Mai i nga uara kua whakarārangihia ka marama ko nga acks e rite ana ki te −1 e whakaatu ana i te tino taurangi e kore e ngaro te karere.

E mohio ana tatou katoa, kaore i te pono nga punaha tohatoha. Hei whakamarumaru i nga hapa ohorere, ka tukuna e Kafka Producer te whiringa ngana ano, ka taea e koe te tautuhi i te maha o nga nganatanga tuku ano i roto tuku.timeout.ms. I te mea he uara taunoa o Integer.MAX_VALUE (2147483647) te tawhā ngana ano, ka taea te whakatika i te maha o nga korero ano ma te huri i te tuku.timeout.ms anake.

Kei te neke tatou ki te tuku kotahi

Ko nga tautuhinga kua whakarārangitia ka taea e to tatou Kaihanga te tuku karere me te taurangi teitei. Me korero inaianei me pehea te whakarite kia kotahi anake te kape o te karere ka tuhia ki tetahi kaupapa Kafka? I roto i te take ngawari, ki te mahi i tenei, me whakarite e koe te tawhā ki te Kaihanga enable.idempotence ki te pono. Ka whakamanahia e te Idempotency kia kotahi noa nga karere ka tuhia ki tetahi wahanga motuhake o te kaupapa kotahi. Ko te tikanga mo te whakaahei i te ngoikoretanga ko nga uara acks = katoa, ngana ano > 0, max.in.flight.requests.per.hononga ≤ 5. Mena kaore enei tawhā i tohua e te kaiwhakawhanake, ka tautuhi aunoa nga uara o runga.

Ina whirihorahia te idempotency, he mea tika ki te whakarite kia rite nga karere ka mutu i roto i nga wehewehenga kotahi i ia wa. Ka taea tenei ma te tautuhi i te matua wehewehe.class me te tawhā ki te Kaihanga. Me timata ma te ki. Me rite tonu mo ia tukunga. Ka taea tenei ma te whakamahi i tetahi o nga ID pakihi mai i te pou taketake. He uara taunoa − te tawhā partitioner.class Kaiwawao Taunoa. Ma tenei rautaki wehewehe, ma te taunoa ka mahi penei tatou:

  • Mena kua tohua te wehewehe i te wa e tukuna ana te karere, ka whakamahia e matou.
  • Mena kaore i tohua te wehewehenga, engari ko te kii kua tohua, tohua te waahanga ma te hash o te matua.
  • Mena karekau te wehewehenga me te taviri i tohua, kowhiria nga wehewehenga takitahi (round-robin).

Ano hoki, ma te whakamahi i te matua me te tuku idempotent me te tawhā max.in.flight.requests.per.connection = 1 ka hoatu ki a koe te tukatuka karere i runga i te Kaihoko. Me maumahara ano mena ka whirihorahia te mana uru ki runga i to roopu, ka hiahia koe ki te whai mana ki te tuhi ki tetahi kaupapa.

Mena ka ngaro koe i te kaha o te tuku ira ma te kii, me te arorau ranei i te taha Kaihanga me pupuri te rite o nga raraunga i waenga i nga wehewehenga rereke, katahi ka haere mai nga whakawhitinga ki te whakaora. I tua atu, ma te whakamahi i te tauwhitinga mekameka, ka taea e koe te tukutahi i tetahi rekoata i Kafka, hei tauira, me te rekoata i roto i te papaaarangi. Kia taea ai te tuku tauwhitinga ki te Kaihanga, me whai mana me te tautuhi ano transactional.id. Mena kua whirihorahia te mana uru o to huinga Kafka, katahi ka hiahia te rekoata tauwhitinga, penei i te rekoata idempotent, me tuhi whakaaetanga, ka taea te tuku ma te kanohi ma te whakamahi i te uara kua penapena ki transactional.id.

Ko te tikanga, ko nga aho katoa, penei i te ingoa tono, ka taea te whakamahi hei tautohu tauwhitinga. Engari ki te whakarewahia e koe etahi waahanga o te tono kotahi me te transactional.id ano, ka mutu te tauira tuatahi i whakarewahia me te he, na te mea ka whakaarohia e Kafka he mahi zombie.

org.apache.kafka.common.errors.ProducerFencedException: Producer attempted an operation with an old epoch. Either there is a newer producer with the same transactionalId, or the producer's transaction has been expired by the broker.

Hei whakaoti i tenei raru, ka taapirihia e matou he pimuri ki te ingoa tono ki te ahua o te ingoa kaihautu, ka riro mai i nga taurangi taiao.

Kua whirihorahia te kaihanga, engari ko nga whakawhitinga i runga i Kafka anake te whakahaere i te whānuitanga o te karere. Ahakoa te ahuatanga o te tauwhitinga, ka haere tonu te karere ki te kaupapa, engari he huanga punaha taapiri.

Kia kore ai e panuihia enei karere e te Kaihoko i mua i te waa, me whakarite te tawhā wehe.taumata ki te uara panui_whakapumau. Ka taea e taua Kaihokohoko te panui i nga karere kore-whakawhitiwhiti pera i mua, me nga karere tauwhitinga i muri noa iho i te tukunga.
Mena kua tautuhia e koe nga tautuhinga katoa kua whakarārangihia i mua, katahi ano ka whirihorahia e koe te tukunga. Kia ora!

Engari tera ano tetahi ahuatanga. Ko te Transactional.id, i whirihorahia e matou i runga ake nei, ko te kupu mua tauwhitinga. I runga i te kaiwhakahaere tauwhitinga, ka taapirihia he nama raupapa. Ka tukuna te kaitautuhi kua whiwhi ki transactional.id.expiration.ms, kua whirihorahia i runga i te kahui Kafka me te uara taunoa "7 ra". Mena i roto i tenei waa kaore ano te tono kia whiwhi karere, katahi ka ngana koe ki te tuku i muri mai ka whiwhi koe InvalidPidMappingException. Ka tukuna e te kairuruku tauwhitinga he nama raupapa hou mo te tauwhitinga e whai ake nei. Heoi, ka ngaro pea te karere ki te kore te InvalidPidMappingException e whakahaere tika.

Engari ki te tapeke

Ka kite koe, kaore e ranea ki te tuku karere noa ki Kafka. Me whiriwhiri koe i te huinga o nga tawhā me te whakarite ki te whakarereke tere. I roto i tenei tuhinga, i whakamatau ahau ki te whakaatu i nga korero mo te wa kotahi te whakatakotoranga tuku me te whakaahua i nga raru maha mo te client.id me te transactional.id whirihoranga i tutaki ki a matou. Kei raro nei te whakarāpopototanga o ngā tautuhinga Kaihanga me te Kaihoko.

Kaihautū:

  1. acks = katoa
  2. ka ngana ano > 0
  3. enable.idempotence = pono
  4. max.in.flight.requests.per.connection ≤ 5 (1 mo te tuku raupapa)
  5. transactional.id = ${ingoa-tono}-${ingoa kaihautū}

Kaihoko:

  1. whakawehe.taumata = read_committed

Hei whakaiti i nga hapa i roto i nga tono a meake nei, i hanga e matou ta matou ake takai i runga i te whirihoranga o te puna, i reira kua whakaritea nga uara mo etahi o nga tawhā kua tohua.

Anei etahi rauemi e rua mo te ako whaiaro:

Source: will.com

Tāpiri i te kōrero