Sida Kafka xaqiiqo u noqotay

Sida Kafka xaqiiqo u noqotay

Haye Habr!

Waxaan ka shaqeeyaa kooxda Tinkoff, oo horumarinaysa xarun wargelineed oo u gaar ah. Inta badan waxaan ku horumariyaa Java anigoo isticmaalaya boot-ka gu'ga waxaanan xalliyaa dhibaatooyin farsamo oo kala duwan oo ka dhasha mashruuca.

Inta badan adeegyadeenna yar-yar ayaa midba midka kale ugu wada xiriiraa si isku mid ah iyada oo loo marayo dillaalka farriinta. Markii hore, waxaan u isticmaalnay IBM MQ sida dullaal, kaas oo aan la qabsan karin culeyska, laakiin isla mar ahaantaana wuxuu lahaa dammaanad gaarsiinta sare.

Beddel ahaan, waxaa naloo soo bandhigay Apache Kafka, kaas oo leh awood miisaan sare leh, laakiin, nasiib daro, waxay u baahan tahay qaab shakhsi ah oo ku dhawaad ​​​​qaabaynta xaaladaha kala duwan. Intaa waxaa dheer, ugu yaraan hal mar habka bixinta ee ka shaqeeya Kafka si caadi ah uma oggolaan in la ilaaliyo heerka joogtada ah ee loo baahan yahay ee ka baxsan sanduuqa. Marka xigta, waxaan la wadaagi doonaa waayo-aragnimadeena qaabeynta Kafka, gaar ahaan, waxaan kuu sheegi doonaa sida loo habeeyo oo loogu noolaado si sax ah hal mar.

Gaadhitaan la dammaanad qaaday iyo qaar kaloo badan

Dejinta hoos looga hadlay ayaa kaa caawin doona ka hortagga dhowr dhibaato oo ku saabsan goobaha isku xirka caadiga ah. Laakiin marka hore waxaan jeclaan lahaa in aan fiiro gaar ah u yeesho halbeeg oo fududayn doona cilladaha suurtagalka ah.

Tani waxay ku caawin doontaa macmiilka.id ee Soo saaraha iyo Macaamilka. Jaleecada hore, waxaad isticmaali kartaa magaca codsiga sida qiimaha, iyo inta badan kiisaska tani waxay shaqayn doontaa. Inkastoo xaalada marka codsi uu isticmaalo dhowr Macaamiil oo aad siiso isla macmiilka.id, waxay keenaysaa digniintan:

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

Haddii aad rabto inaad isticmaasho JMX codsi leh Kafka, markaa tani waxay noqon kartaa dhibaato. Xaaladdan, waxa fiican in la isticmaalo isku-darka magaca codsiga iyo, tusaale ahaan, magaca mawduuca sida macmiilka.id value. Natiijada qaabeyntayada waxaa lagu arki karaa soo-saarka amarka kafka-kooxaha macaamiisha ah Laga soo bilaabo utility ka Confluent:

Sida Kafka xaqiiqo u noqotay

Hadda aan eegno xaaladda fariinta la dammaanad qaaday Soo saaraha Kafka wuxuu leeyahay halbeeg acks, taas oo kuu ogolaanaysa inaad habayso ka dib inta qiratay in hogaamiyaha kooxda uu u baahan yahay inuu tixgeliyo fariinta si guul leh loo qoray. Halbeeggani waxa uu qaadan karaa qiyamka soo socda:

  • 0 β€” aqoonsiga lama tixgelin doono.
  • 1 waa qiyaasta caadiga ah, kaliya 1 nuqul ayaa loo baahan yahay si loo aqoonsado.
  • -1 - qir dhammaan nuqullada la isku daray ayaa loo baahan yahay (habaynta kooxda min.insync.replicas).

Laga soo bilaabo qiyamka liiska, waxaa cad in acks la mid ah -1 ay bixiso dammaanadda ugu xooggan ee ah in farriinta aan la lumin doonin.

Sida aynu wada ognahay, nidaamyada qaybsan waa kuwo aan la isku halayn karin. Si looga ilaaliyo khaladaadka ku meel gaadhka ah, Soo-saare Kafka ayaa bixiya ikhtiyaarka dib u tijaabiyaa, kaas oo kuu ogolaanaya inaad dejiso tirada isku dayga dib u soo celinta gudaha gaarsiinta.waqti-goynta.ms. Maaddaama cabbirka isku-celcelinta uu leeyahay qiimaha caadiga ah ee Integer.MAX_VALUE (2147483647), tirada farriinta dib-u-celinta waxa lagu hagaajin karaa iyada oo la beddelo kaliya gaarsiinta.timeout.ms.

Waxaan u soconaa si sax ah hal mar dhalmada

Goobaha liiska ku qoran waxay u oggolaanayaan Soo-saareheena inuu gudbiyo fariimaha leh dammaanad sare. Aynu hadda ka hadalno sidii loo hubin lahaa in hal nuqul oo fariin ah loo qoray mawduuca Kafka? Xaaladda ugu fudud, si tan loo sameeyo, waxaad u baahan tahay inaad dejiso cabbirka soo saaraha karti.aaminnimo runta. Aqoonsi la'aantu waxay dammaanad qaadaysaa in farriin keliya loo qoro qayb gaar ah oo hal mawduuc ah. Shuruuda horudhaca ah ee suurta gelinta idempotency waa qiyamka acks = dhan, isku day > 0, max.in.flight.requests.per.connection ≀ 5. Haddii xuduudahan aanu cayimin horumariyaha, qiyamka sare ayaa si toos ah loo dejin doonaa.

Marka idempotency la habeeyo, waxaa lagama maarmaan ah in la hubiyo in fariimaha isku mid ah ay ku dhammaanayaan qaybo isku mid ah mar kasta. Tan waxa lagu samayn karaa iyada oo la dejiyo furaha qaybta partitioner.class iyo halbeegga soo saaraha. Aan ku bilowno furaha. Waa inay isku mid noqoto soo gudbin kasta. Tan waxaa si fudud lagu gaari karaa iyadoo la isticmaalayo mid ka mid ah aqoonsiga ganacsiga ee boostada asalka ah. Halbeegga partitioner.class waxa uu leeyahay qiime aan caadi ahayn - DefaultPartitioner. Istaraatiijiyadan qaybinta, asal ahaan waxaan u dhaqmaynaa sidatan:

  • Haddii qaybta si cad loo cayimay marka fariinta la dirayo, markaa waxaanu isticmaalnaa.
  • Haddii qaybta aan la cayimin, laakiin furaha la cayimay, dooro qaybta xashka furaha.
  • Haddii qaybta iyo furaha aan la cayimin, dooro qaybaha mid mid (round-robin).

Sidoo kale, adigoo isticmaalaya furaha iyo idemka awood diraya oo leh halbeeg max.in.flight.requests.per.connection = 1 wuxuu ku siinayaa habaynta fariinta toosan ee Macaamilka. Waxa kale oo ay mudan tahay in la xasuusto in haddii xakamaynta gelitaanka lagu habeeyay kooxdaada, markaa waxaad u baahan doontaa xuquuq aad si awood leh ugu qorto mawduuc.

Haddii si lama filaan ah aad u maqan tahay awoodaha idempotent u diraya furaha ama macquulka ah ee dhinaca soo saaraha waxay u baahan tahay ilaalinta xogta xogta ee u dhaxaysa qaybaha kala duwan, ka dibna macaamiladu waxay u iman doonaan samatabbixinta. Intaa waxaa dheer, adigoo isticmaalaya wax kala iibsiga silsiladda, waxaad si shardi ah ula jaan qaadi kartaa diiwaanka Kafka, tusaale ahaan, diiwaanka kaydka. Si aad awood ugu yeelatid u dirida macaamilka ee soo saaraha, waa in ay noqotaa mid awood leh oo lagu daray macaamil ganacsi.id. Haddii kooxdaada Kafka ay leedahay xakamaynta gelitaanka la habeeyey, ka dib diiwaanka wax kala iibsiga, sida diiwaanka awooda leh, wuxuu u baahan doonaa ogolaansho qoraal ah, kaas oo lagu bixin karo maaskaro iyadoo la isticmaalayo qiimaha lagu kaydiyay transactional.id.

Si rasmi ah, xadhig kasta, sida magaca codsiga, waxa loo isticmaali karaa aqoonsiga macaamil ganacsi ahaan. Laakiin haddii aad bilawdo dhowr xaaladood oo isku mid ah codsi isku mid ah isla transactional.id, markaa tusaalaha ugu horreeya ee la bilaabay ayaa lagu joojin doonaa qalad, maadaama Kafka uu tixgelin doono habka zombies.

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.

Si loo xalliyo dhibaatadan, waxaan ku darsanay magaca codsiga qaabka magaca martida loo yahay, kaas oo aan ka helno doorsoomayaasha deegaanka.

Soo saaraha waa la habeeyey, laakiin macaamilka Kafka kaliya ayaa xakameynaya baaxadda farriinta. Iyadoo aan loo eegin heerka macaamilka, fariintu isla markiiba waxay aadaysaa mawduuca, laakiin waxay leedahay sifooyin nidaam dheeraad ah.

Si looga hortago in fariimahan oo kale ay u akhriyaan Macaamilka ka hor, waxay u baahan tahay inay dejiso cabbirka go'doomin.heer si loo akhriyo_qiimaha go'an. Macaamilka noocan oo kale ah wuxuu awoodi doonaa inuu akhriyo fariimaha aan macaamilka ahayn sidii hore, iyo fariimaha macaamilka kaliya ka dib ballan.
Haddii aad dejisay dhammaan goobaha ku taxan horraantii, markaas waxaad u habaysay si sax ah hal mar. Hambalyo!

Laakiin waxaa jira hal nuance kale. Transaction.id, oo aan kor ku habaynay, dhab ahaantii waa horgalaha wax kala iibsiga. Maamulaha wax kala iibsiga, nambar taxane ah ayaa lagu daraa. Aqoonsiga la helay ayaa la soo saaray macaamil ganacsi.id.ay dhacayso.ms, kaas oo lagu habeeyey kooxda Kafka oo leh qiime aan caadi ahayn oo ah "7 maalmood". Haddii inta lagu jiro wakhtigan arjiga uusan helin wax farriimo ah, markaa markaad isku daydo soo dirida macaamilka ee xigta waxaad heli doontaa InvalidPidMappingException. Xiriiriyaha wax kala iibsiga ayaa markaas soo saari doona nambar cusub oo isku xigxiga macaamilka xiga. Si kastaba ha ahaatee, fariintu way lumi kartaa haddii aan si sax ah loo maamulin InvalidPidMappingException.

Halkii wadar ahaan

Sida aad arki karto, kuma filna in si fudud fariimaha loogu diro Kafka. Waxaad u baahan tahay inaad doorato isku-darka qiyaasaha oo aad u diyaargarowdo inaad isbedel degdeg ah sameyso. Maqaalkan, waxaan isku dayay inaan si faahfaahsan u muujiyo habka saxda ah ee hal mar bixinta waxaanan ku tilmaamay dhibaatooyin dhowr ah oo la xiriira macmiilka.id iyo qaabeynta transactional.id ee aan la kulannay. Hoos waxaa ku qoran soo koobida goobaha soo saaraha iyo macaamiisha.

Soo saaraha:

  1. acks = dhammaan
  2. isku day > 0
  3. karti.idempotence = run
  4. max.in.flight.requests.per. xidhidhka ≀ 5 (1 si habaysan loogu diro)
  5. transactional.id = ${application-name}-${hostname}

Macmiilka:

  1. go'doomin.level = akhrin_go'an

Si loo yareeyo khaladaadka codsiyada mustaqbalka, waxaanu samaynay duubkayaga qaabeynta guga, halkaas oo qiyamka qaar ka mid ah xuduudaha liiska hore loo dejiyay.

Waa kuwan dhowr qalab oo is-barashada:

Source: www.habr.com

Add a comment