Kamoo Kafka e ileng ea fetoha ntho ea sebele kateng

Kamoo Kafka e ileng ea fetoha ntho ea sebele kateng

Hey Habr!

Ke sebetsa sehlopheng sa Tinkoff, se ntseng se iketsetsa setsi sa sona sa litsebiso. Hangata ke nts'etsapele Java ke sebelisa Spring boot mme ke rarolla mathata a fapaneng a tekheniki a hlahang morerong.

Boholo ba li-microservices tsa rona li buisana ka mokhoa o sa tsitsang ka morekisi oa melaetsa. Nakong e fetileng, re ne re sebelisa IBM MQ e le broker, e neng e se e sitoa ho sebetsana ka katleho le mojaro, empa ka nako e ts'oanang e ne e e-na le litiiso tse phahameng tsa ho fana ka thepa.

E le sebaka se seng, re ile ra fuoa Apache Kafka, e nang le bokhoni bo phahameng ba ho phahamisa, empa, ka bomalimabe, e hloka mokhoa o batlang o le mong oa tlhophiso bakeng sa maemo a fapaneng. Ho phaella moo, mokhoa oa ho fana ka bonyane hang o sebetsang Kafka ka ho feletseng ha oa ka oa lumella ho boloka boemo bo hlokahalang ba ho tsitsa ka ntle ho lebokose. Ka mor'a moo, ke tla arolelana phihlelo ea rona ho Kafka configuration, haholo-holo, ke tla u bolella mokhoa oa ho lokisa le ho phela ka ho fana ka nako e le 'ngoe.

Ho tsamaisoa ho netefalitsoeng le tse ling

Litlhophiso tse boletsoeng ka tlase li tla thusa ho thibela mathata a 'maloa ka litlhophiso tsa khokahano ea kamehla. Empa pele ke rata ho ela hloko paramente e le 'ngoe e tla thusa ho rarolla bothata.

Sena se tla thusa client.id bakeng sa Moetsi le Moreki. Ha u sheba ka lekhetlo la pele, u ka sebelisa lebitso la kopo e le boleng, 'me maemong a mangata sena se tla sebetsa. Leha maemo a ha kopo e sebelisa Bareki ba 'maloa 'me u ba fa client.id e tšoanang, e hlahisa temoso e latelang:

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

Haeba u batla ho sebelisa JMX ts'ebelisong le Kafka, sena e ka ba bothata. Tabeng ena, ho molemo ho sebelisa motsoako oa lebitso la kopo le, mohlala, lebitso la sehlooho e le boleng ba client.id. Sephetho sa tlhophiso ea rona se ka bonoa ho tlhahiso ea taelo lihlopha tsa kafka-bareki ho tsoa ho lisebelisoa tse tsoang ho Confluent:

Kamoo Kafka e ileng ea fetoha ntho ea sebele kateng

Joale ha re shebeng boemo ba ho fana ka molaetsa o tiisitsoeng. Kafka Producer o na le parameter acks, e u lumellang hore u lokise ka mor'a hore na ke ba bakae ba lumelang hore moetapele oa sehlopha o hloka ho nahana ka molaetsa o ngotsoeng ka katleho. Paramethara ena e ka nka lintlha tse latelang:

  • 0 - ho amohela ho ke ke ha nahanoa.
  • 1 ke paramethara ea kamehla, ke setšoantšo se le seng feela se hlokahalang ho amohela.
  • −1 - ho hlokahala tumello ho tsoa ho likopi tsohle tse hokahaneng (setupo sa sehlopha min.insync.replicas).

Ho tsoa ho litekanyetso tse thathamisitsoeng ho hlakile hore li-acks tse lekanang le −1 li fana ka tiiso e matla ea hore molaetsa o ke ke oa lahleha.

Joalo ka ha bohle re tseba, litsamaiso tse ajoang ha li tšepahale. Ho sireletsa khahlanong le liphoso tsa nakoana, Kafka Producer e fana ka khetho leka hape, e u lumellang hore u behe palo ea liteko tsa ho romela hape ka hare delivery.timeout.ms. Kaha paramethara ea ho leka hape e na le boleng ba kamehla ba Integer.MAX_VALUE (2147483647), palo ea melaetsa e lekang hape e ka fetoloa ka ho fetola feela delivery.timeout.ms.

Re ntse re lebile ho fana ka thepa hang feela

Litlhophiso tse thathamisitsoeng li lumella Moetsi oa rona ho fana ka melaetsa ka tiisetso e phahameng. Joale ha re bue ka mokhoa oa ho etsa bonnete ba hore kopi e le 'ngoe feela ea molaetsa e ngolloa sehlooho sa Kafka? Boemong bo bonolo, ho etsa sena, o hloka ho beha paramente ho Moetsi nolofalletsa.ho hloka matla ho nnete. Idempotency e tiisa hore molaetsa o le mong feela o ngolloa karolong e itseng ea sehlooho se le seng. Ntho ea pele ea ho etsa hore ho be le boits'oaro ke litekanyetso acks = tsohle, leka hape > 0, max.in.flight.requests.per.connection ≤ 5. Haeba li-parameter tsena li sa hlalosoa ke moqapi, litekanyetso tse ka holimo li tla beoa ka bohona.

Ha idempotency e hlophisitsoe, hoa hlokahala ho netefatsa hore melaetsa e tšoanang e qetella e le likarolo tse tšoanang nako le nako. Sena se ka etsoa ka ho seta konopo ea partitioner.class le parameter ho Producer. Ha re qaleng ka senotlolo. E tlameha ho tšoana bakeng sa tlhahiso ka 'ngoe. Sena se ka finyelloa habonolo ka ho sebelisa leha e le efe ea li-ID tsa khoebo tse tsoang posong ea pele. Partitioner.class parameter e na le boleng ba kamehla - DefaultPartitioner. Ka leano lena la karohano, ka boiketsetso re etsa tjena:

  • Haeba karohano e hlalositsoe ka ho hlaka ha u romella molaetsa, joale rea e sebelisa.
  • Haeba karohano e sa hlalosoa, empa senotlolo se hlalositsoe, khetha karohano ka hash ea senotlolo.
  • Haeba karohano le senotlolo li sa hlalosoa, khetha li-partitions ka bonngoe (ho pota-pota).

Hape, ho sebelisa senotlolo le ho romella ho sa sebetseng ka paramente max.in.flight.requests.per.connection = 1 e u fa mokhoa o hlophisitsoeng oa ho sebetsana le melaetsa ho Moreki. Hape ho bohlokoa ho hopola hore haeba taolo ea phihlello e hlophisitsoe sehlopheng sa hau, joale o tla hloka litokelo tsa ho ngolla sehlooho ka mokhoa o sa tsotelleng.

Haeba ka tšohanyetso u haelloa ke bokhoni ba ho romella ka mokhoa o sa tsebeng letho kapa mohopolo o lehlakoreng la Moetsi o hloka ho boloka botsitso ba data lipakeng tsa likarolo tse fapaneng, joale litšebelisano li tla thusa. Ntle le moo, ka ho sebelisa ketane ea ketane, o ka hokahanya rekoto ho Kafka, mohlala, le rekoto ho database. Ho nolofalletsa ho romella Moetsi ho Moetsi, e tlameha ho hloka matla le ho hlongoa transaction.id. Haeba sehlopha sa hau sa Kafka se na le taolo ea phihlello e hlophisitsoeng, joale rekoto ea transaction, joalo ka rekoto e sa sebetseng, e tla hloka tumello ea ho ngola, e ka fanoang ka mask ho sebelisa boleng bo bolokiloeng ho transactional.id.

Ka molao, khoele efe kapa efe, joalo ka lebitso la kopo, e ka sebelisoa joalo ka sesupo sa transaction. Empa haeba o qala liketsahalo tse 'maloa tsa ts'ebeliso e ts'oanang ka transactional.id e ts'oanang, ketsahalo ea pele e qalileng e tla emisoa ka phoso, kaha Kafka e tla e nka e le ts'ebetso ea 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.

Ho rarolla bothata bona, re kenya sekoti ho lebitso la kopo ka mokhoa oa lebitso la moeti, leo re le fumanang ho tsoa mefuteng ea tikoloho.

Moetsi o hlophisitsoe, empa litšebelisano ho Kafka li laola feela boholo ba molaetsa. Ho sa tsotellehe boemo ba transaction, molaetsa hang-hang o ea sehloohong, empa o na le litšobotsi tse eketsehileng tsa tsamaiso.

Ho thibela melaetsa e joalo hore e se ke ea baloa ke Moreki pele ho nako, e hloka ho beha paramethara ho itšehla thajana.boemo ho bala_boitlamo ba boleng. Moreki ea joalo o tla khona ho bala melaetsa eo e seng ea transaction joaloka pele, le melaetsa ea transaction feela ka mor'a boitlamo.
Haeba u sete li-setting tsohle tse thathamisitsoeng pejana, joale u se u hlophisitse hantle hang ha ho tsamaisoa. Kea u babatsa!

Empa ho na le nuance e 'ngoe hape. Transactional.id, eo re e lokisitseng ka holimo, ha e le hantle ke sehlomapele sa transaction. Ho mookameli oa transaction, nomoro ea tatellano e eketsoa ho eona. Identifier e amohetsoeng e fuoa ho transactional.id.expiration.ms, e hlophisitsoeng sehlopheng sa Kafka 'me e na le boleng bo sa feleng ba "matsatsi a 7". Haeba nakong ena ts'ebeliso ha e so fumane melaetsa, ha u leka ho romella molaetsa o latelang oa transaction o tla e fumana InvalidPidMappingException. Mohokahanyi oa transaction o tla fana ka nomoro e ncha ea tatelano bakeng sa transaction e latelang. Leha ho le joalo, molaetsa o ka lahleha haeba InvalidPidMappingException e sa sebetsoe ka nepo.

Sebakeng sa lipalo

Joalokaha u bona, ha hoa lekana ho romella melaetsa feela ho Kafka. U hloka ho khetha motsoako oa liparamente 'me u itokisetse ho etsa liphetoho tse potlakileng. Sengoliloeng sena, ke lekile ho bonts'a ka botlalo setaele sa ho fana ka nako e le 'ngoe feela mme ka hlalosa mathata a' maloa ka litlhophiso tsa client.id le transactional.id tseo re kopaneng le tsona. Ka tlase ke kakaretso ea litlhophiso tsa Moetsi le Bareki.

Moetsi:

  1. acks = tsohle
  2. leka hape> 0
  3. nolofatsa.idemponce = nnete
  4. max.in.flight.requests.per.connection ≤ 5 (1 bakeng sa ho romela ka tlhophiso)
  5. transactional.id = ${application-name}-${hostname}

Moreki:

  1. ho itšehla thajana.boemo = bala_boitlamo

Ho fokotsa liphoso lits'ebetsong tsa nako e tlang, re iketsetse sekoaelo sa rona nakong ea tlhophiso ea selemo, moo litekanyetso tsa tse ling tsa liparamente tse thathamisitsoeng li seng li behiloe.

Lisebelisoa tse 'maloa tsa ho ithuta ke tsena:

Source: www.habr.com

Eketsa ka tlhaloso