ΠΡΠΈΠ²Π΅Ρ, Π₯Π°Π±Ρ!
Π― ΡΠ°Π±ΠΎΡΠ°Ρ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Tinkoff, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅Π½ΡΡΠ° Π½ΠΎΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΉ. ΠΠΎ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ Ρ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Ρ Π½Π° Java Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Spring boot ΠΈ ΡΠ΅ΡΠ°Ρ ΡΠ°Π·Π½ΡΠ΅ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠΈΠ΅ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅.
ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Π½Π°ΡΠΈΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ ΡΠ΅ΡΠ΅Π· Π±ΡΠΎΠΊΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. Π Π°Π½Π΅Π΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±ΡΠΎΠΊΠ΅ΡΠ° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ IBM MQ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π» ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Ρ Π½Π°Π³ΡΡΠ·ΠΊΠΎΠΉ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΎΠ±Π»Π°Π΄Π°Π» Π²ΡΡΠΎΠΊΠΈΠΌΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡΠΌΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π°ΠΌΠ΅Π½Ρ Π½Π°ΠΌ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΈ Apache Kafka, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π²ΡΡΠΎΠΊΠΈΠΌ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΠΎΠΌ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π½ΠΎ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΠΊ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π². ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ at least once delivery, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ Π² Kafka ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ» ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΡΡΠΈ ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ. ΠΠ°Π»Π΅Π΅ Ρ ΠΏΠΎΠ΄Π΅Π»ΡΡΡ Π½Π°ΡΠΈΠΌ ΠΎΠΏΡΡΠΎΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Kafka, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ ΡΠ°ΡΡΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΈ ΠΆΠΈΡΡ Ρ exactly once delivery.
ΠΠ°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π΄ΠΎΡΡΠ°Π²ΠΊΠ° ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΠΉΠ΄Π΅Ρ ΡΠ΅ΡΡ Π΄Π°Π»Π΅Π΅, ΠΏΠΎΠΌΠΎΠ³ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΡΡΠ΄ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠΎ ΡΠ½Π°ΡΠ°Π»Π° Ρ ΠΎΡΠ΅ΡΡΡ ΡΠ΄Π΅Π»ΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π»Π΅Π³ΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ Π΄Π΅Π±Π°Π³.
Π ΡΡΠΎΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ client.id Π΄Π»Ρ Producer ΠΈ Consumer. ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ. Π₯ΠΎΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ConsumerβΠΎΠ² ΠΈ Π²Ρ Π·Π°Π΄Π°Π΅ΡΠ΅ ΠΈΠΌ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ client.id, ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ:
org.apache.kafka.common.utils.AppInfoParser β Error registering 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, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ, ΠΏΠΎΡΠ»Π΅ ΡΠΊΠΎΠ»ΡΠΊΠΈΡ acknowledge Π»ΠΈΠ΄Π΅ΡΡ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠΈΡΠ°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΌ. ΠΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
- 0 β acknowledge Π½Π΅ Π±ΡΠ΄ΡΡ ΡΡΠΈΡΠ°ΡΡΡΡ.
- 1 β ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ acknowledge ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡ 1 ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ.
- β1 β Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ acknowledge ΠΎΡ Π²ΡΠ΅Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ΅ΠΏΠ»ΠΈΠΊ (Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΊΠ»Π°ΡΡΠ΅ΡΠ° min.insync.replicas).
ΠΠ· ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ acks ΡΠ°Π²Π½ΡΠΉ β1 Π΄Π°Π΅Ρ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠΈΠ»ΡΠ½ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΠΈ, ΡΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΡΠ΅ΡΡΠ΅ΡΡΡ.
ΠΠ°ΠΊ ΠΌΡ Π²ΡΠ΅ Π·Π½Π°Π΅ΠΌ, ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ. Π§ΡΠΎΠ±Ρ Π·Π°ΡΠΈΡΠΈΡΡΡΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π½Π΅ΠΈΡΠΏΡΠ°Π²Π½ΠΎΡΡΠ΅ΠΉ, Kafka Producer ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ retries, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠΏΡΡΠΎΠΊ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ delivery.timeout.ms. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ retries ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Integer.MAX_VALUE (2147483647), ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΎΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π³ΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ, ΠΌΠ΅Π½ΡΡ ΡΠΎΠ»ΡΠΊΠΎ delivery.timeout.ms.
ΠΠ²ΠΈΠΆΠ΅ΠΌΡΡ ΠΊ exactly once delivery
ΠΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π½Π°ΡΠ΅ΠΌΡ ProducerβΡ Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ Π²ΡΡΠΎΠΊΠΎΠΉ Π³Π°ΡΠ°Π½ΡΠΈΠ΅ΠΉ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² Kafka-ΡΠΎΠΏΠΈΠΊ? Π ΡΠ°ΠΌΠΎΠΌ ΠΏΡΠΎΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π° Producer Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ 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 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.
Π§ΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΡΡΡΠΈΠΊΡ Π² Π²ΠΈΠ΄Π΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ ΠΎΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ.
Producer Π½Π°ΡΡΡΠΎΠ΅Π½, Π½ΠΎ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π½Π° Kafka ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±Π»Π°ΡΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠ½Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΠ°ΡΡΡΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π·Ρ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² ΡΠΎΠΏΠΈΠΊ, Π½ΠΎ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌΠΈ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ.
Π§ΡΠΎΠ±Ρ ΡΠ°ΠΊΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π΅ ΡΡΠΈΡΡΠ²Π°Π»ΠΈΡΡ ConsumerβΠΎΠΌ ΡΠ°Π½ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π΅ΠΌΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ 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