Pehea ʻo Kafka i lilo ai i mea ʻoiaʻiʻo

Pehea ʻo Kafka i lilo ai i mea ʻoiaʻiʻo

E Habr!

Hana wau ma ka hui Tinkoff, e hoʻomohala nei i kāna kikowaena hoʻolaha ponoʻī. Hoʻomohala nui wau ma Java me ka hoʻohana ʻana i ka boot Spring a hoʻoponopono i nā pilikia ʻenehana e kū mai ana i kahi papahana.

ʻO ka hapa nui o kā mākou microservices e kamaʻilio me kekahi i kekahi ma o ka mea kūʻai leka uila. Ma mua, ua hoʻohana mākou iā IBM MQ ma ke ʻano he mea kūʻai aku, ʻaʻole hiki ke hoʻokō hou i ka ukana, akā i ka manawa like i loaʻa nā hōʻoia kiʻekiʻe.

Ma ke ʻano he pani, ua hāʻawi ʻia iā mākou ʻo Apache Kafka, nona ka mana scaling kiʻekiʻe, akā, ʻo ka mea pōʻino, koi ʻia kahi kokoke i kēlā me kēia kanaka i ka hoʻonohonoho ʻana no nā hiʻohiʻona like ʻole. Eia kekahi, ʻo ka liʻiliʻi loa o ka mīkini hoʻouna e hana ana ma Kafka ma ke ʻano maʻamau ʻaʻole i ʻae i ka mālama ʻana i ke kiʻekiʻe o ke kūpaʻa i makemake ʻia ma waho o ka pahu. A laila, e kaʻana aku wau i kā mākou ʻike ma ka hoʻonohonoho Kafka, ʻoi aku ka nui, e haʻi wau iā ʻoe pehea e hoʻonohonoho ai a noho me ka hoʻouna ʻana i hoʻokahi manawa.

Hōʻoiaʻiʻo i ka lawe ʻana a me nā mea hou aku

ʻO nā hoʻonohonoho i kūkākūkā ʻia ma lalo nei e kōkua i ka pale ʻana i kekahi mau pilikia me nā hoʻonohonoho pili paʻamau. Akā makemake mua wau e hoʻolohe i kahi ʻāpana e hoʻomaʻamaʻa i kahi debug hiki.

E kōkua kēia client.id no ka mea hana a me ka mea kūʻai aku. I ka nānā mua ʻana, hiki iā ʻoe ke hoʻohana i ka inoa noi ma ke ʻano he waiwai, a ma ka hapa nui e hana kēia. ʻOiai ʻo ke kūlana i ka wā e hoʻohana ai kahi noi i nā mea kūʻai aku a hāʻawi ʻoe iā lākou i ka client.id like, e hopena i kēia ʻōlelo aʻo:

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

Inā makemake ʻoe e hoʻohana iā JMX i kahi noi me Kafka, a laila pilikia paha kēia. No kēia hihia, ʻoi aku ka maikaʻi o ka hoʻohana ʻana i ka hui ʻana o ka inoa noi a, no ka laʻana, ka inoa kumuhana e like me ka waiwai client.id. Hiki ke ʻike ʻia ka hopena o kā mākou hoʻonohonoho ʻana ma ka puka kauoha kafka-consumer-groups mai nā pono hana mai Confluent:

Pehea ʻo Kafka i lilo ai i mea ʻoiaʻiʻo

I kēia manawa, e nānā kāua i ke ʻano no ka hoʻouna ʻana i ka memo. Loaʻa iā Kafka Producer kahi ʻāpana acks, hiki iā ʻoe ke hoʻonohonoho ma hope o ka nui o nā manaʻo e pono ai ke alakaʻi cluster e noʻonoʻo i ka memo i kākau maikaʻi ʻia. Hiki i kēia ʻāpana ke lawe i kēia mau waiwai:

  • 0 - ʻaʻole e noʻonoʻo ʻia ka ʻae.
  • ʻO 1 ka palena paʻamau, pono 1 kope wale nō e ʻae.
  • −1 — koi ʻia mai nā replicas i hoʻonohonoho ʻia (cluster setup min.insync.replicas).

Mai nā koina i helu ʻia ua maopopo ka loaʻa ʻana o nā acks e like me −1 i ka hōʻoia ikaika loa ʻaʻole e nalowale ka leka.

E like me kā mākou ʻike a pau, ʻaʻole hilinaʻi nā ʻōnaehana puʻunaue. No ka pale ʻana i nā hewa transient, hāʻawi ʻo Kafka Producer i ke koho ho'āʻo hou, hiki iā ʻoe ke hoʻonohonoho i ka helu o ka hoʻouna hou ʻana i loko delivery.timeout.ms. No ka mea, he waiwai paʻamau ka helu hoʻāʻo hou ʻana o Integer.MAX_VALUE (2147483647), hiki ke hoʻololi i ka helu o ka hoʻāʻo hou ʻana me ka hoʻololi ʻana i ka delivery.timeout.ms wale nō.

Ke neʻe nei mākou i ka hoʻouna ʻana hoʻokahi

ʻO nā hoʻonohonoho i helu ʻia e ʻae i kā mākou mea hana e hoʻouna i nā memo me kahi hōʻoia kiʻekiʻe. E kamaʻilio kākou i kēia manawa pehea e hōʻoia ai i hoʻokahi kope o ka leka i kākau ʻia i kahi kumuhana Kafka? I ka hihia maʻalahi, no ka hana ʻana i kēia, pono ʻoe e hoʻonohonoho i ka parameter ma ka Mea hana hiki.idempotence i ka oiaio. Hōʻoiaʻiʻo ʻo Idempotency e kākau ʻia hoʻokahi memo i kahi ʻāpana kikoʻī o hoʻokahi kumuhana. ʻO ke kūlana mua no ka hiki ʻana i ka idempotency nā waiwai acks = pau, ho'āʻo hou > 0, max.in.flight.requests.per.connection ≤ 5. Inā ʻaʻole i kuhikuhi ʻia kēia mau ʻāpana e ka mea hoʻomohala, e hoʻonohonoho ʻia nā koina i luna.

Ke hoʻonohonoho ʻia ka idempotency, pono e hōʻoia i ka pau ʻana o nā memo like i nā ʻāpana like i kēlā me kēia manawa. Hiki ke hana i kēia ma ka hoʻonohonoho ʻana i ke kī partitioner.class a me ka hoʻohālikelike iā Producer. E hoʻomaka kākou me ke kī. Pono e like no kēlā me kēia hoʻouna. Hiki ke maʻalahi kēia ma ka hoʻohana ʻana i kekahi o nā ID ʻoihana mai ka pou kumu. He waiwai paʻamau ka ʻāpana partitioner.class − Mea Paʻamau. Me kēia hoʻolālā hoʻokaʻawale, hana mākou e like me kēia:

  • Inā hōʻike maopopo ʻia ka ʻāpana i ka wā e hoʻouna ai i ka leka, a laila hoʻohana mākou.
  • Inā ʻaʻole i kuhikuhi ʻia ka ʻāpana, akā ua kuhikuhi ʻia ke kī, koho i ka ʻāpana e ka hash o ke kī.
  • Inā ʻaʻole i hōʻike ʻia ka ʻāpana a me ke kī, koho i nā ʻāpana i kēlā me kēia (round-robin).

Eia kekahi, me ka hoʻohana ʻana i kahi kī a me ka hoʻouna idempotent me kahi ʻāpana max.in.flight.requests.per.connection = 1 hāʻawi iā ʻoe i ka hoʻoili ʻana i ka memo ma ka Consumer. Pono nō hoʻi e hoʻomanaʻo inā hoʻonohonoho ʻia ka mana komo ma kāu puʻupuʻu, a laila pono ʻoe i nā kuleana e kākau inoa i kahi kumuhana.

Inā nele ʻoe i ka hiki o ka hoʻouna ʻana i ka idempotent ma ke kī a i ʻole ka loiloi ma ka ʻaoʻao Producer e pono ai e mālama i ka kūlike o ka ʻikepili ma waena o nā ʻāpana like ʻole, a laila e hele mai nā kālepa e hoʻopakele. Eia kekahi, me ka hoʻohana ʻana i kahi kālepa kaulahao, hiki iā ʻoe ke hoʻonohonoho pono i kahi moʻolelo ma Kafka, no ka laʻana, me kahi moʻolelo i ka waihona. I mea e hiki ai i ka hoʻouna transactional i ka Mea Hana, pono ia i idempotent a hoʻonohonoho hou transactional.id. Inā loaʻa i kāu pūʻulu Kafka ka mana hiki ke hoʻonohonoho ʻia, a laila pono kahi moʻolelo transactional, e like me kahi moʻolelo idempotent, e pono e kākau i nā ʻae, hiki ke hāʻawi ʻia e ka mask me ka hoʻohana ʻana i ka waiwai i mālama ʻia ma transactional.id.

Ma keʻano maʻamau, hiki ke hoʻohana ʻia kekahi kaula, e like me ka inoa noi, ma ke ʻano he ʻike kālepa. Akā inā ʻoe e hoʻomaka i kekahi mau manawa o ka noi like me ka transactional.id like, a laila e hoʻopau ʻia ka mea mua i hoʻokuʻu ʻia me kahi hewa, no ka mea e manaʻo ʻo Kafka he kaʻina 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.

No ka hoʻoponopono ʻana i kēia pilikia, hoʻohui mākou i kahi suffix i ka inoa noi ma ke ʻano o ka hostname, i loaʻa iā mākou mai nā mea hoʻololi kaiapuni.

Hoʻonohonoho ʻia ka mea hana, akā ʻo nā kālepa ma Kafka e hoʻomalu wale i ke ʻano o ka memo. Ma waho o ke kūlana kālepa, hele koke ka leka i ke kumuhana, akā loaʻa nā ʻano ʻōnaehana hou.

No ka pale ʻana i kēlā mau memo mai ka heluhelu ʻana e ka Consumer ma mua o ka manawa, pono ia e hoʻonohonoho i ka ʻāpana kaʻawale.level e heluhelu_i ka waiwai. Hiki i kēlā mea kūʻai ke heluhelu i nā memo non-transactional e like me ka wā ma mua, a me nā memo transactional wale nō ma hope o ka hana ʻana.
Inā ua hoʻonohonoho ʻoe i nā hoʻonohonoho āpau i helu ʻia ma mua, a laila ua hoʻonohonoho pololei ʻoe i ka hoʻouna ʻana. Hoʻomaikaʻi!

Akā aia kekahi nuance hou. ʻO Transactional.id, a mākou i hoʻonohonoho ai ma luna, ʻo ia ka prefix mua. Ma ka luna hoʻokele, hoʻohui ʻia kahi helu kaʻina iā ia. Hāʻawi ʻia ka mea hōʻike i loaʻa iā transactional.id.expiration.ms, i hoʻonohonoho ʻia ma kahi pūʻulu Kafka a loaʻa ka waiwai paʻamau o "7 lā". Inā i kēia manawa ʻaʻole i loaʻa i ka noi kekahi mau leka, a laila ke hoʻāʻo ʻoe i ka hoʻouna transactional hou e loaʻa iā ʻoe InvalidPidMappingException. A laila e hoʻopuka ka mea hoʻoponopono kālepa i kahi helu kaʻina no ka hana aʻe. Eia naʻe, nalo paha ka memo inā ʻaʻole mālama pono ʻia ka InvalidPidMappingException.

Ma kahi o nā hopena

E like me kāu e ʻike ai, ʻaʻole lawa ka hoʻouna wale ʻana i nā leka iā Kafka. Pono ʻoe e koho i kahi hui o nā ʻāpana a mākaukau e hoʻololi wikiwiki. Ma kēia ʻatikala, ua hoʻāʻo wau e hōʻike kikoʻī i ka hoʻonohonoho hoʻouna ʻana i hoʻokahi manawa a wehewehe i kekahi mau pilikia me ka client.id a me transactional.id configurations a mākou i hālāwai ai. Aia ma lalo kahi hōʻuluʻulu o nā hoʻonohonoho Mea hana a me nā mea kūʻai aku.

ka hoʻohua:

  1. acks = pau
  2. hoao hou > 0
  3. enable.idempotence = ʻoiaʻiʻo
  4. max.in.flight.requests.per.connection ≤ 5 (1 no ka hoʻouna pololei ʻana)
  5. transactional.id = ${inoa-inoa}-${inoa hookipa}

Mea kūʻai aku:

  1. isolation.level = heluhelu_koi

No ka hōʻemi ʻana i nā hewa i nā noi e hiki mai ana, ua hana mākou i kā mākou mea hoʻopili ponoʻī ma luna o ka hoʻonohonoho pūnāwai, kahi i hoʻonohonoho ʻia ai nā waiwai no kekahi o nā ʻāpana i helu ʻia.

Eia ʻelua mau mea no ke aʻo ʻana iā ʻoe iho:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka