Olee otú Kafka si ghọọ eziokwu

Olee otú Kafka si ghọọ eziokwu

Ndewo, Habr!

M na-arụ ọrụ na Tinkoff otu, nke na-emepe emepe ngosi nke ya. M na-etolitekarị na Java site na iji buut mmiri ma dozie nsogbu teknụzụ dị iche iche na-ebilite na ọrụ.

Ọtụtụ n'ime microservice anyị na-ekwurịta okwu n'otu n'otu site na onye na-ere ahịa ozi. Na mbụ, anyị na-eji IBM MQ dị ka onye na-ere ahịa, nke na-enweghị ike ịnagide ibu ahụ, ma n'otu oge ahụ nwere nkwa nnyefe dị elu.

Dị ka onye na-anọchi anya, e nyere anyị Apache Kafka, nke nwere ikike dị elu, ma, ọ dị mwute ikwu, na-achọ ihe fọrọ nke nta ka ọ bụrụ onye ọ bụla na nhazi nhazi maka ọnọdụ dị iche iche. Tụkwasị na nke ahụ, ọ dịkarịa ala otu usoro nnyefe nke na-arụ ọrụ na Kafka na ndabara ekweghị ka ịnọgide na-enwe ọkwa dị mkpa nke nkwụsi ike na igbe ahụ. Na-esote, m ga-ekekọrịta ahụmahụ anyị na nhazi Kafka, karịsịa, m ga-agwa gị otu esi ahazi ma na-ebi ndụ kpọmkwem ozugbo nnyefe.

Nbunye ekwela nkwa na ihe ndị ọzọ

Ntọala ndị a tụlere n'okpuru ga-enyere aka igbochi ọtụtụ nsogbu na ntọala njikọ ndabara. Mana nke mbụ, ọ ga-amasị m ịṅa ntị na otu paramita nke ga-eme ka ọ dị mfe debug.

Nke a ga-enyere aka onye ahịa.id maka onye na-emepụta ihe na onye ahịa. Na ilele mbụ, ị nwere ike iji aha ngwa dị ka uru, na n'ọtụtụ ọnọdụ nke a ga-arụ ọrụ. Agbanyeghị ọnọdụ mgbe ngwa na-eji ọtụtụ ndị ahịa wee nye ha otu client.id, na-ebute ịdọ aka ná ntị ndị a:

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

Ọ bụrụ na ịchọrọ iji JMX na ngwa na Kafka, nke a nwere ike ịbụ nsogbu. Maka nke a, ọ kacha mma iji nchikota nke aha ngwa na, dịka ọmụmaatụ, aha isiokwu dịka uru ahịa client.id. Enwere ike ịhụ nsonaazụ nke nhazi anyị na mmepụta iwu kafka-ndị ahịa-otu sitere na akụrụngwa sitere na Confluent:

Olee otú Kafka si ghọọ eziokwu

Ugbu a, ka anyị leba anya na ọnọdụ maka izipu ozi ekwelarịrị. Kafka Producer nwere oke akwa, nke na-enye gị ohere ịhazi mgbe ole kwenyesiri ike na onye ndu ụyọkọ kwesịrị ịtụle ozi edere nke ọma. Oke a nwere ike were ụkpụrụ ndị a:

  • 0 - agaghị atụle nkwenye.
  • 1 bụ oke ndabara, naanị otu oyiri ka achọrọ iji kwenye.
  • -1 - kwenye site na oyiri niile emekọrịtara ka achọrọ (ntọlite ​​ụyọkọ min.insync.replicas).

Site na ụkpụrụ edepụtara, o doro anya na acks hà nhata -1 na-enye nkwa kachasị ike na ozi agaghị efu.

Dị ka anyị niile maara, usoro kesara enweghị ntụkwasị obi. Iji chebe megide mmejọ na-adịte aka, Kafka Producer na-enye nhọrọ na-emegharị, nke na-enye gị ohere ịtọ nọmba nke resend mgbalị n'ime nnyefe.oge agwụ.ms. Ebe oke nrụgharị ahụ nwere uru ndabara nke Integer.MAX_VALUE (2147483647), enwere ike gbanwee ọnụọgụ nke nrụgharị ozi site na ịgbanwe naanị nnyefe.timeout.ms.

Anyị na-aga n'ihu ozugbo nnyefe

Ntọala edepụtara na-enye onye nrụpụta anyị ohere izipu ozi yana nkwa dị elu. Ka anyị kwuo ugbu a ka anyị ga-esi hụ na ọ bụ naanị otu ozi ka edere na isiokwu Kafka? N'okwu kachasị mfe, iji mee nke a, ịkwesịrị ịtọ paramita na Onye nrụpụta eme.idem ike na eziokwu. Idempotency na-ekwe nkwa na ọ bụ naanị otu ozi ka edere n'otu akụkụ nke otu isiokwu. Ihe nrịbama maka ike idempotency bụ ụkpụrụ acks = niile, megharịa> 0, max.in.flight.requests.per.connection ≤ 5. Ọ bụrụ na onye nrụpụta akọwapụtaghị paramita ndị a, a ga-edozi ụkpụrụ ndị dị n'elu na-akpaghị aka.

Mgbe a na-ahazi idempotency, ọ dị mkpa iji hụ na otu ozi na-ejedebe n'otu akụkụ oge ọ bụla. Enwere ike ime nke a site na ịtọ igodo partitioner.class na paramita na Onye nrụpụta. Ka anyị jiri igodo bido. Ọ ga-abụrịrị otu maka nrubeisi ọ bụla. Enwere ike nweta nke a n'ụzọ dị mfe site na iji NJ azụmahịa ọ bụla sitere na nbipute izizi. Oke partitioner.class nwere uru ndabara - Nkebi an-kpọ. Site na usoro nkewa nke a, na ndabara anyị na-eme dị ka nke a:

  • Ọ bụrụ na akọwapụtara nkebi ahụ n'ụzọ doro anya mgbe ị na-ezipụ ozi ahụ, anyị na-eji ya.
  • Ọ bụrụ na akọwapụtaghị nkebi ahụ, mana akọwapụtara igodo, họrọ nkebi site na hash nke igodo ahụ.
  • Ọ bụrụ na akọwapụtaghị nkebi na igodo, họrọ nkebi otu otu (round-robin).

Ọzọkwa, iji igodo na ike izipu nwere oke max.in.flight.requests.per.connection = 1 na-enye gị nhazi ozi streamlined na ndị ahịa. Ọ dịkwa mma icheta na ọ bụrụ na ahaziri njikwa ohere na ụyọkọ gị, mgbe ahụ ị ga-achọ ikike iji onwe gị dee isiokwu.

Ọ bụrụ na ị na-enweghị ike na mberede nke idempotent na-ezipụ site na igodo ma ọ bụ mgbagha dị n'akụkụ Onye nrụpụta chọrọ ịnọgide na-enwe nkwekọ data n'etiti akụkụ dị iche iche, mgbe ahụ, azụmahịa ga-abịa napụta. Na mgbakwunye, iji azụmahịa yinye, ị nwere ike mekọrịta ndekọ na Kafka n'ọnọdụ ọnọdụ, dịka ọmụmaatụ, yana ndekọ na nchekwa data. Iji mee ka izipu azụmahịa nye Onye nrụpụta, ọ ga-abụrịrị ike ma tinyekwa ya azụmahịa.id. Ọ bụrụ na ahaziri ụyọkọ Kafka gị nwere njikwa ohere, mgbe ahụ ndekọ azụmahịa, dị ka ndekọ nke nwere ike, ga-achọ ikikere ide, nke enwere ike inye ya site na nkpuchi site na iji uru echekwara na transactional.id.

Na usoro, eriri ọ bụla, dị ka aha ngwa, nwere ike iji dị ka ihe nchọpụta azụmahịa. Ma ọ bụrụ na ị malite ọtụtụ oge nke otu ngwa ahụ na otu transactional.id, mgbe ahụ a ga-akwụsị ihe mbụ ebido na njehie, ebe Kafka ga-ewere ya dị ka usoro 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.

Iji dozie nsogbu a, anyị na-agbakwunye suffix na aha ngwa n'ụdị aha nnabata, nke anyị na-enweta site na mgbanwe gburugburu ebe obibi.

A na-ahazi onye na-emepụta ihe, mana azụmahịa na Kafka na-achịkwa oke ozi ahụ. N'agbanyeghị ọnọdụ azụmahịa, ozi ahụ na-aga ozugbo na isiokwu ahụ, ma nwere njirimara usoro ndị ọzọ.

Iji gbochie ụdị ozi ndị ahụ ka onye ahịa na-agụ tupu oge eruo, ọ kwesịrị ịtọ oke iche.ọkwa iji gụọ_uru uru. Onye ahịa dị otú ahụ ga-enwe ike ịgụ ozi na-abụghị nke azụmahịa dị ka ọ dị na mbụ, yana ozi azụmahịa naanị ka emechara ya.
Ọ bụrụ na ịtọọla ntọala niile edepụtara na mbụ, yabụ ị haziela ozugbo nnyefe. Ekele!

Ma enwere otu nuance ọzọ. Transaction.id, nke anyị haziri n'elu, bụ n'ezie prefix azụmahịa. Na njikwa azụmahịa, a na-agbakwunye nọmba usoro na ya. Enyere njirimara enwetara azụmahịa.id. expiration.ms, nke a na-ahazi na ụyọkọ Kafka ma nwee uru ndabara nke "ụbọchị 7". Ọ bụrụ na n'oge a ngwa ahụ enwetabeghị ozi ọ bụla, mgbe ahụ mgbe ị na-agbalị izipu azụmahịa ọzọ ị ga-enweta Nwepu ezighi eziPidMapping. Onye nhazi azụmahịa ga-ewepụta nọmba usoro ọhụrụ maka azụmahịa na-esote. Agbanyeghị, ozi a nwere ike ịla n'iyi ma ọ bụrụ na ejikwaghị InvalidPidMappingException nke ọma.

Kama nsonaazụ

Dị ka ị pụrụ ịhụ, o zughị nanị iziga ozi na Kafka. Ịkwesịrị ịhọrọ ngwakọta nke paramita ma dịrị njikere ime mgbanwe ngwa ngwa. N'isiokwu a, m gbalịrị igosi n'ụzọ zuru ezu kpọmkwem otu ugboro nnyefe ntọala na kọwara ọtụtụ nsogbu na client.id na transactional.id nhazi nke anyị zutere. N'okpuru bụ nchịkọta nke ntọala ndị nrụpụta na ndị ahịa.

Producer:

  1. acks = niile
  2. na-emegharị> 0
  3. ike.idempotence = eziokwu
  4. max.in.flight.requests.per.connection ≤ 5 (1 maka izipu n'usoro)
  5. transactional.id = ${application-name}-${hostname}

Ahịa:

  1. isolation.level = read_committed

Iji belata njehie na ngwa n'ọdịnihu, anyị mere ihe mkpuchi nke anyị na nhazi mmiri, ebe edobere ụkpụrụ maka ụfọdụ paramita edepụtara.

Nke a bụ ihe ole na ole maka ọmụmụ onwe onye:

isi: www.habr.com

Tinye a comment