Ahoana no nahatonga an'i Kafka ho zava-misy

Ahoana no nahatonga an'i Kafka ho zava-misy

Hey Habr!

Miasa ao amin'ny ekipa Tinkoff aho, izay mamolavola ny foibe fampandrenesana azy manokana. Ny ankamaroany dia mivoatra amin'ny Java mampiasa boot Spring aho ary mamaha olana ara-teknika isan-karazany mitranga amin'ny tetikasa iray.

Ny ankamaroan'ny microservices dia mifampiresaka amin'ny asynchronous amin'ny alΓ lan'ny broker hafatra. Teo aloha, nampiasa IBM MQ ho toy ny broker izahay, izay tsy mahazaka ny entana intsony, fa miaraka amin'izay koa, manana antoka avo lenta.

Amin'ny maha solony azy dia nomena Apache Kafka izahay, izay manana tanjaky ny haavon'ny haavony, saingy, indrisy, mitaky fomba fiasa saika isam-batan'olona amin'ny fandrindrana ny toe-javatra samihafa. Ho fanampin'izay, ny mekanika fanaterana indray mandeha farafaharatsiny izay miasa ao Kafka amin'ny alΓ lan'ny default dia tsy namela ny fitazonana ny haavon'ny tsy fitoviana ilaina ivelan'ny boaty. Manaraka, hizara ny traikefantsika amin'ny fanamafisana Kafka aho, indrindra indrindra, hilaza aminao ny fomba hanamboarana sy hiaina miaraka amin'ny fandefasana indray mandeha.

Livraison azo antoka sy maro hafa

Ireo toe-javatra resahina etsy ambany dia hanampy amin'ny fisorohana ny olana maromaro amin'ny firafitry ny fifandraisana default. Fa aloha aho dia te-hijery paramètre iray izay hanamora ny mety hisian'ny debug.

Hanampy izany client.id ho an'ny Mpamokatra sy Mpanjifa. Raha vao jerena dia azonao atao ny mampiasa ny anaran'ny fampiharana ho sandany, ary amin'ny ankamaroan'ny tranga dia mety izany. Na dia eo aza ny zava-misy rehefa mampiasa mpanjifa maromaro ny fampiharana iray ary omenao azy ireo client.id mitovy, dia miteraka izao fampitandremana manaraka izao:

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

Raha te hampiasa JMX amin'ny fampiharana miaraka amin'i Kafka ianao dia mety ho olana izany. Amin'ity tranga ity, tsara kokoa ny mampiasa fitambaran'ny anaran'ny fampiharana sy, ohatra, ny anaran'ny lohahevitra ho sanda client.id. Ny vokatry ny fandrindrana dia azo jerena ao amin'ny baiko Output kafka-consumer-groups avy amin'ny fitaovana avy amin'ny Confluent:

Ahoana no nahatonga an'i Kafka ho zava-misy

Andeha hojerentsika izao ny scenario momba ny fandefasana hafatra azo antoka. Ny Kafka Producer dia manana paramètre acks, izay ahafahanao manitsy aorian'ny isan'ny manaiky fa mila mandinika ny hafatra nosoratan'ny mpitarika cluster. Ity mari-pamantarana ity dia afaka maka ireto sanda manaraka ireto:

  • 0 - tsy ho raisina ny fanekena.
  • 1 no mari-pamantarana default, kopia 1 ihany no ilaina hanaiky.
  • βˆ’1 - ilaina ny fanekena avy amin'ny replica synchronize rehetra (fametrahana cluster min.insync.replicas).

Avy amin'ireo soatoavina voatanisa dia mazava fa ny acks mitovy amin'ny βˆ’1 dia manome antoka matanjaka indrindra fa tsy ho very ilay hafatra.

Araka ny fantatsika rehetra dia tsy azo ianteherana ny rafitra zaraina. Mba hiarovana amin'ny hadisoana mandalo, manome ny safidy ny Kafka Producer manandrana indray, izay ahafahanao mametraka ny isan'ny andrana mamerina ao anatiny delivery.timeout.ms. Koa satria manana sanda voafantina Integer.MAX_VALUE (2147483647) ny mari-pamantarana famerenana indray, dia azo ahitsy amin'ny fanovana ny delivery.timeout.ms ihany ny isan'ny famerenan'ny hafatra.

Mizotra mankany amin'ny fanaterana indray mandeha katroka izahay

Ny fika voatanisa dia mamela ny Mpamokatra anay handefa hafatra miaraka amin'ny antoka ambony. Andeha isika hiresaka momba ny fomba hahazoana antoka fa dika mitovy amin'ny hafatra iray ihany no nosoratana ho an'ny lohahevitra Kafka? Amin'ny tranga tsotra indrindra, mba hanaovana izany dia mila mametraka ny parameter amin'ny Producer ianao enable.idempotence ho marina. Idempotency dia miantoka fa hafatra iray ihany no voasoratra amin'ny fizarana manokana amin'ny lohahevitra iray. Ny fepetra takiana amin'ny fampandehanana ny idempotency dia ny soatoavina acks = rehetra, andramo indray > 0, max.in.flight.requests.per.connection ≀ 5. Raha tsy voafaritry ny mpamorona ireo mari-pamantarana ireo dia hapetraka ho azy ireo sanda etsy ambony.

Rehefa voaendrika idempotency dia ilaina ny miantoka fa ireo hafatra mitovy dia miafara amin'ny fizarazarana mitovy isaky ny mandeha. Izany dia azo atao amin'ny fametrahana ny lakile partitioner.class sy ny parameter amin'ny Producer. Andeha isika hanomboka amin'ny fanalahidy. Tsy maintsy mitovy izany isaky ny fanolorana. Mora tratrarina izany amin'ny alΓ lan'ny fampiasana ny ID momba ny orinasa avy amin'ny lahatsoratra voalohany. Ny parameter partitioner.class dia manana sanda default βˆ’ DefaultPartitioner. Miaraka amin'ity paikady fisarahana ity, amin'ny alΓ lan'ny default dia manao toy izao izahay:

  • Raha voatondro mazava tsara ny fisarahana rehefa mandefa ny hafatra, dia ampiasainay izany.
  • Raha tsy voatondro ny fisarahana, fa voatondro ny lakile, safidio ny fisarahana amin'ny alΓ lan'ny hash amin'ny fanalahidy.
  • Raha toa ka tsy voafaritra ny fizarazarana sy ny lakile dia safidio tsirairay ny fizarazarana (round-robin).

Ary koa, mampiasa fanalahidy sy idempotent fandefasana miaraka amin'ny parameter max.in.flight.requests.per.connection = 1 manome anao ny fanodinana hafatra mirindra amin'ny Consumer. Tsara hotadidina ihany koa fa raha amboarina ao amin'ny cluster anao ny fanaraha-maso ny fidirana, dia mila zo ianao hanoratra amin'ny lohahevitra iray.

Raha tampoka dia tsy ampy ny fahaizan'ny fandefasana idempotent amin'ny alΓ lan'ny fanalahidy na ny lojika eo amin'ny lafiny Producer dia mitaky fitazonana ny fitovian'ny angon-drakitra eo amin'ny fizarana samihafa, dia ho avy ny fifampiraharahana. Ankoatr'izay, amin'ny fampiasana varotra rojo, azonao atao ny mampifanaraka ny firaketana an-tsoratra ao amin'ny Kafka, ohatra, miaraka amin'ny rakitra ao amin'ny angon-drakitra. Mba ahafahana mandefa fifampiraharahana any amin'ny Mpamokatra, dia tsy maintsy idΓ©potent ary apetraka ihany koa transactional.id. Raha toa ka manana fanaraha-maso ny fidirana ao amin'ny vondrona Kafka ianao, dia mila fahazoan-dΓ lana hanoratra ny firaketana ara-barotra, toy ny firaketana idempotent, izay azo omena amin'ny alΓ lan'ny saron-tava mampiasa ny sanda voatahiry ao amin'ny transactional.id.

Amin'ny fomba ofisialy, ny tady rehetra, toy ny anaran'ny fampiharana, dia azo ampiasaina ho famantarana ny fifanakalozana. Saingy raha manomboka tranga maromaro amin'ny fampiharana mitovy amin'ny transactional.id mitovy ianao, dia hajanona amin'ny hadisoana ny ohatra natomboka voalohany, satria i Kafka dia mihevitra azy io ho dingana 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.

Mba hamahana ity olana ity dia ampiana tovana ny anaran'ny fampiharana amin'ny endriky ny anaran'ny mpampiantrano, izay azontsika avy amin'ny fari-piainan'ny tontolo iainana.

Namboarina ny mpamokatra, fa ny fifampiraharahana ao amin'ny Kafka ihany no mifehy ny faritry ny hafatra. Na inona na inona sata momba ny fifampiraharahana, ny hafatra dia mankany amin'ny lohahevitra, saingy manana toetran'ny rafitra fanampiny.

Mba hisorohana ny hafatra toy izany tsy hovakian'ny Consumer mialoha ny fotoana, dia mila mametraka ny mari-pamantarana isolation.level mba hamaky_fanoloran-tena. Ny mpanjifa toy izany dia afaka mamaky hafatra tsy misy fifampiraharahana toy ny teo aloha, ary hafatra ara-barotra raha tsy aorian'ny fanoloran-tena.
Raha toa ianao ka nametraka ny fika rehetra voatanisa teo aloha, dia efa namboarinao indray mandeha ny fandefasana. Arahabaina!

Saingy misy nuance iray hafa. Transactional.id, izay namboarinay etsy ambony, no tena tovan'ny transaction. Ao amin'ny mpitantana ny varotra dia ampiana laharana filaharana izany. Ny identifier voaray dia avoaka amin'ny transactional.id.expiration.ms, izay amboarina ao amin'ny kluster Kafka ary manana sanda mahazatra "7 andro". Raha toa ka tsy nahazo hafatra ny fampiharana nandritra izany fotoana izany, dia rehefa manandrana ny fandefasana transactional manaraka ianao dia hahazo InvalidPidMappingException. Ny mpandrindra ny fifampiraharahana dia hamoaka laharana filaharana vaovao ho an'ny fifampiraharahana manaraka. Mety ho very anefa ilay hafatra raha tsy voakarakara tsara ny InvalidPidMappingException.

Raha tokony ho totaly

Araka ny hitanao dia tsy ampy ny mandefa hafatra amin'ny Kafka fotsiny. Mila misafidy fitambarana masontsivana ianao ary miomana hanao fanovana haingana. Amin'ity lahatsoratra ity dia nanandrana nampiseho tamin'ny antsipiriany ny fanamboarana fanaterana indray mandeha aho ary nanoritsoritra olana maro tamin'ny configuration client.id sy transactional.id izay sendra anay. Ity ambany ity ny famintinana ny firafitry ny mpamokatra sy ny mpanjifa.

mpamokatra:

  1. acks = rehetra
  2. averina > 0
  3. enable.idempotence = marina
  4. max.in.flight.requests.per.connection ≀ 5 (1 ho an'ny fandefasana milamina)
  5. transactional.id = ${application-name}-${hostname}

Mpanjifa:

  1. isolation.level = read_committed

Mba hanamaivanana ny lesoka amin'ny rindranasa ho avy, dia nanao fonon-tananay manokana momba ny fanamafisam-peon'ny lohataona izahay, izay efa napetraka ny soatoavina ho an'ny masontsivana sasany voatanisa.

Ireto misy fitaovana roa ho an'ny fianarana samirery:

Source: www.habr.com

Add a comment