
ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅, Π₯Π°Π±Ρ!
Π Π°Π±ΠΎΡΡ Π² Π΅ΠΊΠΈΠΏΠ° Π½Π° 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 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 ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β . ΠΡΠΈ ΡΡΠΎΠΉ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
- ΠΡΠ»ΠΈ ΠΏΠ°ΡΡΠΈΡΠΈΡ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°Π½Π° ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΅Π΅.
- ΠΡΠ»ΠΈ ΠΏΠ°ΡΡΠΈΡΠΈΡ Π½Π΅ ΡΠΊΠ°Π·Π°Π½Π°, Π½ΠΎ ΡΠΊΠ°Π·Π°Π½ ΠΊΠ»ΡΡ β Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΠ°ΡΡΠΈΡΠΈΡ ΠΏΠΎ Ρ ΡΡΡ ΠΎΡ ΠΊΠ»ΡΡΠ°.
- ΠΡΠ»ΠΈ ΠΏΠ°ΡΡΠΈΡΠΈΡ ΠΈ ΠΊΠ»ΡΡ Π½Π΅ ΡΠΊΠ°Π·Π°Π½Ρ β Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ ΠΏΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ (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:
- acks = all
- retries > 0
- enable.idempotence = true
- max.in.flight.requests.per.connection β€ 5 (1 β Π·Π° ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅)
- transactional.id = ${application-name}-${hostname}
Consumer:
- isolation.level = read_committed
ΠΠ° Π΄Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π³ΡΠ΅ΡΠΊΠΈΡΠ΅ Π² Π±ΡΠ΄Π΅ΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π½Π°Π΄ spring ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ Π²Π΅ΡΠ΅ ΡΠ° Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π·Π° Π½ΡΠΊΠΎΠΈ ΠΎΡ ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ.
Π Π΅ΡΠΎ ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π° Π·Π° ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΡΡΠ°Π²Π°Π½Π΅:
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
