Как Kafka стана рСалност

Как Kafka стана рСалност

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅, Π₯Π°Π±Ρ€!

Работя Π² Π΅ΠΊΠΈΠΏΠ° Π½Π° Tinkoff, ΠΊΠΎΠΉΡ‚ΠΎ сС Π·Π°Π½ΠΈΠΌΠ°Π²Π° с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° собствСн Ρ†Π΅Π½Ρ‚ΡŠΡ€ Π·Π° Π½ΠΎΡ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. По-голямата част ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ пиша Π½Π° Java с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Spring boot ΠΈ Ρ€Π΅ΡˆΠ°Π²Π°ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ тСхничСски ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‰ΠΈ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

ΠŸΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΎΡ‚ Π½Π°ΡˆΠΈΡ‚Π΅ микросСрвизи взаимодСйстват ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρƒ си асинхронно Ρ‡Ρ€Π΅Π· Π±Ρ€ΠΎΠΊΠ΅Ρ€ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ. ΠŸΡ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ IBM MQ ΠΊΠ°Ρ‚ΠΎ Π±Ρ€ΠΎΠΊΠ΅Ρ€, ΠΊΠΎΠΉΡ‚ΠΎ спря Π΄Π° сС справя с Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ, Π½ΠΎ имашС високи Π³Π°Ρ€Π°Π½Ρ†ΠΈΠΈ Π·Π° доставка.

ΠšΠ°Ρ‚ΠΎ Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° Π½ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ…Π° Apache Kafka, която ΠΏΡ€Π΅Π΄Π»Π°Π³Π° висок ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» Π·Π° ΠΌΠ°Ρ‰Π°Π±ΠΈΡ€Π°Π½Π΅, Π½ΠΎ, Π·Π° съТалСниС, изисква практичСски ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»Π΅Π½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ сцСнарии. ОсвСн Ρ‚ΠΎΠ²Π°, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡŠΡ‚ Π·Π° доставка β€˜at least once’, ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π² Kafka, Π½Π΅ позволява ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½Π΅Ρ‚ΠΎ Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡ‚ΠΎ Π½ΠΈΠ²ΠΎ Π½Π° консистСнтност извън кутията. По-Π΄ΠΎΠ»Ρƒ Ρ‰Π΅ сподСля нашия ΠΎΠΏΠΈΡ‚ с конфигурацията Π½Π° Kafka, ΠΊΠ°Ρ‚ΠΎ особСно Ρ‰Π΅ Ρ€Π°Π·ΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ Π΄Π° настроитС ΠΈ Π΄Π° ΠΆΠΈΠ²Π΅Π΅Ρ‚Π΅ с β€˜exactly once’ доставка.

Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°Π½Π° доставка ΠΈ Π½Π΅ само

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅, Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ станС Π²ΡŠΠΏΡ€ΠΎΡ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ, Ρ‰Π΅ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ‚ Π΄Π° сС прСдотвратят Ρ€Π΅Π΄ΠΈΡ†Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с настройкитС ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅. Но ΠΏΡŠΡ€Π²ΠΎ искам Π΄Π° ΠΎΠ±ΡŠΡ€Π½Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ улСсни Π΅Π²Π΅Π½Ρ‚ΡƒΠ°Π»Π½ΠΎΡ‚ΠΎ дСбъгванС.

Π’ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ client.id ΠΈ Π·Π° Producer, ΠΈ Π·Π° Consumer. На ΠΏΡ€ΡŠΠ² ΠΏΠΎΠ³Π»Π΅Π΄, ΠΊΠ°Ρ‚ΠΎ стойност ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΈ Π² ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ случаи Ρ‚ΠΎΠ²Π° Ρ‰Π΅ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚ΠΈ. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, ситуацията, Π² която ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° няколко Consumer-Π° ΠΈ Π²ΠΈΠ΅ Π·Π°Π΄Π°Π²Π°Ρ‚Π΅ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ client.id, Π²ΠΎΠ΄ΠΈ Π΄ΠΎ слСдното ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅:

org.apache.kafka.common.utils.AppInfoParser β€” Π“Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ рСгистрация Π½Π° AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0

Ако искатС Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ JMX Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с Kafka, Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π’ Ρ‚Π°ΠΊΡŠΠ² случай Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ комбинация ΠΎΡ‚ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ, Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ, ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠΏΠΈΠΊΠ° ΠΊΠ°Ρ‚ΠΎ стойност Π½Π° client.id. Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ Π½Π°ΡˆΠ°Ρ‚Π° конфигурация ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π² ΠΈΠ·Ρ…ΠΎΠ΄Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° kafka-consumer-groups ΠΎΡ‚ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΈΡ‚Π΅ Π½Π° Confluent:

Как Kafka стана рСалност

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ сцСнария Π·Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°Π½Π° доставка Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅. Kafka Producer ΠΈΠΌΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ acks, ΠΊΠΎΠΉΡ‚ΠΎ позволява Π΄Π° сС настрои слСд ΠΊΠΎΠ»ΠΊΠΎ ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΡ Π½Π° Π»ΠΈΠ΄Π΅Ρ€Π° Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°, ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ трябва Π΄Π° сС счита Π·Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ записано. Π’ΠΎΠ·ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ° слСднитС стойности:

  • 0 β€” ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΡΡ‚Π° няма Π΄Π° сС считат.
  • 1 β€” ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, изисква сС ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ само ΠΎΡ‚ 1 Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°.
  • βˆ’1 β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΡ‚ всСх синхронизированных Ρ€Π΅ΠΏΠ»ΠΈΠΊ (настройка кластСра min.insync.replicas).

Из пСрСчислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ acks Ρ€Π°Π²Π½Ρ‹ΠΉ βˆ’1 Π΄Π°Π΅Ρ‚ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ сообщСниС Π½Π΅ потСряСтся.

Как ΠΌΡ‹ всС Π·Π½Π°Π΅ΠΌ, распрСдСлСнныС систСмы Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹. Для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… нСисправностСй Kafka Producer прСдоставляСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ retries, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ количСство ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ delivery.timeout.ms. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ retries ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ Integer.MAX_VALUE (2147483647), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ количСство ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΎΡ‚ΠΏΡ€Π°Π²ΠΎΠΊ сообщСния ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, измСняя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ delivery.timeout.ms.

ДвигаСмся ΠΊ exactly once delivery

Π’Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Π΅ настройки ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΡˆΠ΅ΠΌΡƒ Producer’у Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ сообщСния с высокой Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠ΅ΠΉ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ обсудим, ΠΊΠ°ΠΊ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запись Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ сообщСния Π² Kafka-Ρ‚ΠΎΠΏΠΈΠΊ? Π’ самом простом случаС для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ enable.idempotence Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true. Π˜Π΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ запись Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ сообщСния Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΏΠΈΠΊΠ°. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ условиями для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ идСмпотСнтности ΡΠ²Π»ΡΡŽΡ‚ΡΡ значСния acks = all, retry > 0, max.in.flight.requests.per.connection ≀ 5. Если эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ, Ρ‚ΠΎ автоматичСски Π±ΡƒΠ΄ΡƒΡ‚ установлСны упомянутыС Π²Ρ‹ΡˆΠ΅ значСния.

Когда ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ настроСна, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ сообщСния всСгда ΠΏΠΎΠΏΠ°Π΄Π°Π»ΠΈ Π² ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, настроив ΠΊΠ»ΡŽΡ‡ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ partitioner.class Π½Π° Producer. НачнСм с ΠΊΠ»ΡŽΡ‡Π°. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ. Π­Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ бизнСс-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΠ· ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ сообщСния. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ partitioner.class ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” DefaultPartitioner. ΠŸΡ€ΠΈ этой стратСгии партиционирования ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ дСйствуСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • Если партиция явно ΡƒΠΊΠ°Π·Π°Π½Π° ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ сообщСния, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π΅.
  • Если партиция Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π°, Π½ΠΎ ΡƒΠΊΠ°Π·Π°Π½ ΠΊΠ»ΡŽΡ‡ β€” Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΡŽ ΠΏΠΎ Ρ…ΡΡˆΡƒ ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡Π°.
  • Если партиция ΠΈ ΠΊΠ»ΡŽΡ‡ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ β€” Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΈ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ (round-robin).

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, использованиС ΠΊΠ»ΡŽΡ‡Π° ΠΈ ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ max.in.flight.requests.per.connection = 1 прСдоставя Π²ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π° ΠΎΡ‚ Consumer. Врябва Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Π°ΠΊΠΎ Π² кластСра Π²ΠΈ Π΅ настроСно ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏΠ°, Ρ‰Π΅ Π²ΠΈ трябват ΠΏΡ€Π°Π²Π° Π·Π° ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½ΠΎ записванС Π² Ρ‚ΠΎΠΏΠΈΠΊΠ°.

Ако ΠΏΠΎ някаква ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π²ΠΈ липсват Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π·Π° ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡ ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° страната Π½Π° Producer изисква Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° консистСнтността Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΈ, Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈΡ‚Π΅ Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ‚. ОсвСн Ρ‚ΠΎΠ²Π°, с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π²Π΅Ρ€ΠΈΠ³ΠΎΠ²Π° транзакция ΠΌΠΎΠΆΠ΅Ρ‚Π΅ условно Π΄Π° синхронизиратС записа Π² Kafka, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с запис Π² Π‘Π”. Π—Π° Π΄Π° Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Ρ‚Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° Producer, Ρ‚ΠΎΠΉ трябва Π΄Π° бъдС ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π΅Π½ ΠΈ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ transactional.id. Ако Π² Kafka кластСра Π²ΠΈ Π΅ настроСно ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏΠ°, Ρ‚ΠΎ Π·Π° транзакционния запис, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π·Π° идСмпотСнтния, Ρ‰Π΅ Π²ΠΈ трябват ΠΏΡ€Π°Π²Π° Π·Π° запис, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ прСдоставСни ΠΏΠΎ маска, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰Π° стойността, ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‰Π° сС Π² transactional.id.

Π€ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° транзакцията ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° всяка Π½ΠΈΠ·, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. Но Π°ΠΊΠΎ стартиратС няколко инстанции Π½Π° Π΅Π΄Π½ΠΎ ΠΈ ΡΡŠΡ‰ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ transactional.id, ΠΏΡŠΡ€Π²Π°Ρ‚Π° стартирана инстанция Ρ‰Π΅ бъдС спряна с Π³Ρ€Π΅ΡˆΠΊΠ°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Kafka Ρ‰Π΅ я смСтнС Π·Π° Π·ΠΎΠΌΠ±ΠΈ-процСс.

org.apache.kafka.common.errors.ProducerFencedException: Producer Π΅ ΠΎΠΏΠΈΡ‚Π°Π» опСрация с стара Π΅ΠΏΠΎΡ…Π°. Има ΠΈΠ»ΠΈ ΠΏΠΎ-Π½ΠΎΠ² producer със ΡΡŠΡ‰ΠΈΡ transactionalId, ΠΈΠ»ΠΈ транзакцията Π½Π° producer Π΅ Π±ΠΈΠ»Π° ΠΈΠ·Ρ‚Π΅ΠΊΠ»Π° ΠΎΡ‚ Π±Ρ€ΠΎΠΊΠ΅Ρ€Π°.

Π—Π° Π΄Π° Ρ€Π΅ΡˆΠΈΡ‚Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, добавямС към ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ суфикс ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° хоста, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π½Π° срСдата.

Producer Π΅ настроСн, Π½ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π² Kafka управляват само ΠΎΠ±Ρ…Π²Π°Ρ‚Π° Π½Π° видимост Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ. НСзависимо ΠΎΡ‚ статуса Π½Π° транзакцията, ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ ΠΏΠΎΠΏΠ°Π΄Π° Π² Ρ‚ΠΎΠΏΠΈΠΊΠ°, Π½ΠΎ ΠΈΠΌΠ° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ систСмни Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈ.

Π—Π° Π΄Π° Π½Π΅ Π±ΡŠΠ΄Π°Ρ‚ Ρ‚Π°ΠΊΠΈΠ²Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½ΠΈ ΠΎΡ‚ Consumer-a ΠΏΡ€Π΅Π΄ΠΈ Π²Ρ€Π΅ΠΌΠ΅, Ρ‚ΠΎΠΉ трябва Π΄Π° Π·Π°Π΄Π°Π΄Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° isolation.level Π½Π° стойност read_committed. Вакъв Consumer Ρ‰Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ‡Π΅Ρ‚Π΅ Π½Π΅Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΈ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΊΠ°ΠΊΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΈ, Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΈΡ‚Π΅ β€” само слСд ΠΊΠΎΠΌΠΈΡ‚Π°.
Ако стС настроили всички ΠΈΠ·Π±Ρ€ΠΎΠ΅Π½ΠΈ ΠΏΠΎ-Π³ΠΎΡ€Π΅ настройки, Π²ΠΈΠ΅ стС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π»ΠΈ exactly once delivery. ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»Π΅Π½ΠΈΡ!

Но ΠΈΠΌΠ° ΠΎΡ‰Π΅ Π΅Π΄ΠΈΠ½ нюанс. Transactional.id, ΠΊΠΎΠΉΡ‚ΠΎ настройвахмС ΠΏΠΎ-Π³ΠΎΡ€Π΅, Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΅ прСфикс Π½Π° транзакцията. Към ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€Π° Π½Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ сС добавя ΠΏΠΎΡ€Π΅Π΄Π΅Π½ Π½ΠΎΠΌΠ΅Ρ€. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π°Ρ‚Π° идСнтификация сС ΠΈΠ·Π΄Π°Π²Π° Π½Π° transactional.id.expiration.ms, ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π° Π½Π° Kafka ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° ΠΈ ΠΈΠΌΠ° ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‰Π° сС стойност β€ž7 Π΄Π½ΠΈβ€œ. Ако ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π΅ Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π»ΠΎ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π·Π° Ρ‚ΠΎΠ²Π° Π²Ρ€Π΅ΠΌΠ΅, ΠΏΡ€ΠΈ ΠΎΠΏΠΈΡ‚ Π·Π° слСдващото Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ InvalidPidMappingException. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈΡ‚Π΅ Ρ‰Π΅ прСдостави Π½ΠΎΠ² послСдоватСлСн Π½ΠΎΠΌΠ΅Ρ€ Π·Π° слСдващата транзакция. Π’ Ρ‚ΠΎΠ·ΠΈ процСс ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π·Π°Π³ΡƒΠ±Π΅Π½ΠΎ, Π°ΠΊΠΎ InvalidPidMappingException Π½Π΅ бъдС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ.

ВмСсто обобщСния

ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡ‚Π΅, Π½Π΅ Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ просто Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚Π΅ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π² Kafka. Врябва Π΄Π° ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅ комбинация ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΈ Π΄Π° Π±ΡŠΠ΄Π΅Ρ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΈ Π·Π° Π±ΡŠΡ€Π·ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ. Π’ Ρ‚Π°Π·ΠΈ статия сС ΠΎΠΏΠΈΡ‚Π°Ρ… ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ° настройката Π·Π° exactly once delivery ΠΈ описах няколко ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с конфигурацията Π½Π° client.id ΠΈ transactional.id, с ΠΊΠΎΠΈΡ‚ΠΎ сС ΡΠ±Π»ΡŠΡΠΊΠ°Ρ…ΠΌΠ΅. По-Π΄ΠΎΠ»Ρƒ Π² ΠΊΡ€Π°Ρ‚ΠΊΠ° Ρ„ΠΎΡ€ΠΌΠ° са прСдставСни настройкитС Π½Π° Producer ΠΈ Consumer.

Producer:

  1. acks = all
  2. retries > 0
  3. enable.idempotence = true
  4. max.in.flight.requests.per.connection ≀ 5 (1 β€” Π·Π° ΠΏΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅)
  5. transactional.id = ${application-name}-${hostname}

Consumer:

  1. isolation.level = read_committed

Π—Π° Π΄Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ Π² Π±ΡŠΠ΄Π΅Ρ‰ΠΈΡ‚Π΅ прилоТСния, ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ собствСна ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π½Π°Π΄ spring конфигурацията, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π²Π΅Ρ‡Π΅ са Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ стойности Π·Π° някои ΠΎΡ‚ ΠΈΠ·Π±Ρ€ΠΎΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ.

А Π΅Ρ‚ΠΎ ΠΈ няколко ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Π·Π° самостоятСлно ΠΈΠ·ΡƒΡ‡Π°Π²Π°Π½Π΅:

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster