α αα α!
αααα»αααααΎααΆαααΎαααα»α Tinkoff ααααααα»ααααααΎααααααααααααΌαααααΉαααααΆαααααα½αα αααα»αααΆαα αααΎαα’αα·αααααα Java αααααααΎ Spring boot αα·ααααααααΆααααα αΆαα αα ααααααααααααααααΎαα‘αΎααα αααα»ααααααααα½αα
ααΆαα αααΎαααααααΆααΈααααΌααααααΎαααΆααααααααΆαα αα·ααα αααααα’ααααΆαααΆαααααααα½ααααααΆαααΆαα ααΈαα»α ααΎαααΆαααααΎ IBM MQ ααΆαααα½ααααααΆα ααααα·αα’αΆα ααααααααΉαααααα»αααΆαααααα ααα»αααααα αααααΆαα½αααααΆαααααΆαααΆαααΆααΆααΎααΆαααΉααααααΌααααααα
αααα»αααΆαααΆα’ααααααα½α ααΎαααααΌαααΆααααααααΌα Apache Kafka αααααΆααααααΆαα»ααααααΆαααααΎααΆαααααααΆαααααα ααα»ααααααΆα’αα»αα ααΆαααΆααα·ααΈααΆααααααα»ααααααααΎαααααΆααα’αααααα»αααΆαααααααα ααΆαααααααααααααΆααααααΆααΈαααΌααααααα ααΎαααΈααα ααααααΆααααααΌααααΆαα αα ααΆαααααααααααααΎαααΆααα αααα»α Kafka ααΆαααααΆαααΎααα·αα’αα»ααααΆαα±αααααααΆααΆαααΌαααααα·ααααααααΌαααΆαααααΆααααΈαααααΆααααααΆαααα αααα’αααααααα αααααΆαα αααα»αααΉαα ααααααααααα·αααααααααααΎααααα»αααΆαααααααα ααΆαααααααα Kafka ααΆαα·ααααααα»αααΉαααααΆααα’αααααΈααααααααααα ααΆαααααααα αα·αααααα ααΆαα½αααΆαα ααα αΆαααααΆααα
ααΆααΆααΆαααΉααααααΌα αα·αα αααΎαααα
ααΆαααααααααααΆααα·ααΆααααΆααΆααααααααΉααα½αααΆαααΆααααα αΆαα½αα ααα½αααΆαα½αααΉαααΆααααααααΆααααααΆααααααΆαααΎαα ααα»ααααααΆααααΌααααα»αα ααααα α·ααααα»αααΆααααΎαααΆαααΆαααααααα½ααααααΉααα½αααααα½ααααααΆαααααΆααααα α»ααααα’αΆα ααΎαααΆαα
αααααΉααα½α client.id αααααΆααα’αααααα·α αα·αα’αααααααΎααααΆααα αα glance ααααΌαα’αααα’αΆα ααααΎααααααααααα·ααΈααΆαααααα αΎααααα»αααααΈααΆαα αααΎαααΆααΉαααααΎαααΆαα αααααΈααΆααααΆαααΆααα αααααααααααα·ααΈααααΎααααΆααα’αααααααΎααααΆααααΆα αααΎα α αΎαα’ααααααααα±αααα½αααααΌα 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 ααΆααααΆαααΆαααααα α’αααααα’αα»ααααΆαα±ααα’αααααααααα ααΆαααααααααααααΆααααΈα ααα½αααα»ααααΆααααααα½αααααΆααα’αααααΉαααΆαα αααααααααΌαααΆαααΎααααΈαα·α αΆαααΆααΆααααααΆαααααααααααααααα αααΆαααΆαααααααααα’αΆα αααααααααΌα ααΆααααααα
- 0 - ααΆαααα½αααααΆααααΉααα·αααααΌαααΆααα·α αΆαααΆααα
- 1 ααΊααΆαααΆαααΆααααααααααΆαααΎα ααΆαααααΆαα αααα 1 ααα»ααααααααααααΌαααΆαααΆαααΆαααΎααααΈααα½αααααΆααα
- β1 β ααΆαααα½αααααΆααααΈααΆαα αααααααααΆαααααΎααααΆαααααααΆααα’ααααΊααααΌαααΆαααΆαααΆα (ααΆαααα‘αΎαα ααααα min.insync.replicas).
ααΈααααααααααΆαααΆααααααΈ ααΆα αααΆααααΆααααΆ acks ααααΎααΉα β1 αααααααΆαααΆααΆααααΆαααααα»αααΆααΆαααΉααα·αααΆαααααα‘αΎαα
ααΌα αααααΎαααΉαααααΆααα αΎα ααααααααα ααα αΆααα·ααα½αα±αααα»αα α·αααα ααΎααααΈααΆαααΆααααααΆααααΉαααα α»αααααααα’αΆαααα Kafka Producer ααααααααααΎα ααααΆααΆαααααααααααα’αα»ααααΆαα±ααα’ααααααααα ααα½αααααΆαααααΆααΆαααααΎα‘αΎααα·ααα αααα»α delivery.timeout.ms. αααααΆααααΆαααΆααααααααααΆααΆααααααααααΆααααααααααΆαααΎααα Integer.MAX_VALUE (2147483647) α ααα½αααααΆαααααΆααΆαααΆαα‘αΎααα·αα’αΆα ααααΌαααΆααααααααΌααααααΆαααααΆααααααΌααα delivery.timeout.ms ααα»αααααα
ααΎααααα»αααααααα ααααΆαα ααα αΆαααααΆαα
ααΆαααααααααααΆαααΆααααααΈα’αα»ααααΆαα±ααα’αααααα·αααααααΎααααααΌαααΆαααΆαα½αααΉαααΆαααΆααΆαααααα α₯α‘αΌαβαααβααΌαβαα·ααΆαβα’αααΈβααααβααΎααααΈβααΆααΆβααΆβααΆαβααβαα½αβα αααΆααβααααΌαβααΆαβαααααβαα βααΆααβαααααΆαβαα Kafka? αααα»αααααΈααΆαααααααα»αααΎααααΈααααΎααΆα’αααααααΌαααααααααΆαααΆαααααααα ααΎα’αααααα·α enable.idempotence αα·αα Ideempotency ααΆααΆααΆααΆαααααΆααα½αααα»ααααααααααααΌαααΆαααααααα ααΆαααΆααααΆαααααααααΆααααα½αα ααααααααααΆαα»ααααααΆααααΆαααααΎα±ααααΆαααΆαααααααααααΊααΆααααα acks = ααΆααα’αα, ααααΆααΆαααααααα > 0, max.in.flight.requests.per.connection β€ 5. ααααα·αααΎαααΆαααΆααααααααΆααααααα·αααααΌαααΆααααααΆαααααα’αααα’αα·ααααααααααααααααααΆαααΎααΉαααααΌαααΆαααααααααααααααααααααα·α
αα
αααααα idempotency ααααΌαααΆαααααααα
ααΆαααααααα ααΆα
αΆαααΆα
αααΎααααΈααΆααΆααΆααΆαααΌα
ααααΆαααα
αααα
αααα»αααΆαααΆαααΌα
ααααΆααΆαααααα αααα’αΆα
ααααΌαααΆαααααΎααααααααααΌααα partitioner.class αα·ααααΆαααΆαααααααα
α’αααααα·αα α
αΌαα
αΆααααααΎαααΆαα½αααΉααααααΉαα ααΆααααΌαααααΌα
ααααΆαααααΆααααΆαααΆααααααΎααΈαα½ααα αααα’αΆα
αααααα
ααΆααααΆαααΆααααα½ααααααααΎααααααααΆααα’αΆααΈαααααααΆαα½αααΈαααααΆαααΎαα αααΆαααΆαααααα partitioner.class ααΆααααααααααΆαααΎα β
- ααααα·αααΎααΆαααΆαααααΌαααΆααααααΆαααααΆαα αααΆαααα αααααααΎααΆα αααααΎαααααΎααΆα
- ααααα·αααΎααΆαααΆααα·αααααΌαααΆααααααΆαα ααα»ααααααΌαααααααΌαααΆααααααΆαα ααΌαααααΎαααΎαααΆαααΆαααααααααΆααααααΆααα α»α α
- ααααα·αααΎααΆαααΆα αα·αααααΆααα α»α αα·αααααΌαααΆααααααΆαα ααΌαααααΎαααΎαααΆαααΆααααααα½αα (αα»α-αααΌαααΈα)α
ααααααααααααΎαα αα·α ideempotent ααααΎααΆαα½ααααΆαααΆαααααααα½αα max.in.flight.requests.per.connection = 1 αααααα±ααα’αααααΌαααααΎαααΆαααΆααααααααα½ααα ααΎα’αααααααΎααααΆααα ααΆαααα½αα αα αΆααααααααΆ ααααα·αααΎααΆααααααααααααΆαα αΌαααααΎααααΌαααΆαααααααα ααΆαααααααααα ααΎα αααααααααα’ααα αααα’αααααΉαααααΌαααΆααα·αααα·αααα»αααΆαααααααααα’α ααααΆα αααααααααΆααααα½αα
ααααα·αααΎααααΆαααααα’ααααααααααααααΆαααααΆααααααΌααααααΌααα α¬αααααα·ααααΆαα ααΆαα’αααααα·ααααααΌαα±αααααααΆααΆααααΈαααααΆααααααΆαααα·αααααααααΆαααΆαααΆαααααααααααΆ αααααααα·ααααα·ααΆαααΉααααα½αααααααααα ααΎαααΈαααααα αααααααΎααααα·ααααα·ααΆααααααααααΆαα α’αααα’αΆα ααααΎααααΆααααααααααααααΆαα αααα»α Kafka ααΆα§ααΆα ααα ααΆαα½αααΉααααααααααΆαα αααα»αααΌαααααΆααα·ααααααα ααΎααααΈααΎαααααΎαααΆαααΆαααααΎαα α’αααααα·α ααΆααααΌαααααααΆααααααααΆα αα·αααααααααααα transactional.id. ααααα·αααΎα ααααα Kafka ααααα’αααααΆαααΆααααααααααααΆαα αΌαααααΎαααααΆαααααααα ααΆαααααααα ααααααααααααΆααααα·ααααα·ααΆα ααΌα ααΆαααααααααΆ ideempotent ααΉαααααΌαααΆαααΆαα’αα»ααααΆααααα»αααΆαααααα αααα’αΆα ααααΌαααΆααααααααααααΆαααααααααΎααααααααααΆααααααΆαα»ααα αααα»α 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.
ααΎααααΈαααααααΆααααα αΆααα ααΎααααααααα αα αααα ααααααααααα·ααΈαααα»αααααααααΆ hostname αααααΎαααα½αααΆαααΈα’αααααα·ααααΆαα
α’αααααα·αααααΌαααΆαααααααα ααΆαααααααα ααα»ααααααααα·ααααα·ααΆααα ααΎ Kafka ααααααααααααα·ααΆαααΆαααααΆαααα»αααααα ααααα·ααα·αααΈααααΆαααΆαααααα·ααααα·ααΆα ααΆαααααΆαααα ααΆαααααααΆααα ααα»ααααααΆααα»αααααααααααααααααααααα
ααΎααααΈαααΆαααααΆααααααααα·αααααΌαααΆαα’αΆααααα’αααααααΎααααΆααααΆαα»αααΆααααααΌαααααααααΆαααΆαααααα isolation.level ααΎααααΈα’αΆα_ααααααααααΆααααααΆα α’αααααααΎααααΆααααααααααΉαα’αΆα
α’αΆαααΆαααααα·ααααααΆααααα·ααααα·ααΆαααΌα
ααΈαα»α α αΎαααΆαααααα·ααααα·ααΆαααΆααα»αααααΆααααΆαααΆαααααααααΆα
α·αααα
ααααα·αααΎα’αααααΆααααααααΆααααααααΆααα’αααααααΆαααΆααααααΈαα»αααα αααα’αααααΆαααααααα
ααΆααααααααααααΆαααα
αααα
ααα
αΆαα α’αα’αααΆαα!
ααα»ααααααΆα nuance αα½ααααααααααα Transactional.id αααααΎαααααααα ααΆααααααααααΆαααΎ ααΊαα·αααΆαα»αααααααααα·ααααα·ααΆαα αα ααΎαααααα·ααΈαααααααααααααα·ααααα·ααΆα αααααααΆαααα½αααααΌαααΆααααααααα ααΆα α’ααααααααΆααααααΆαααα½αααααΌαααΆαα ααα±αα transactional.id.expiration.msαααααααΌαααΆαααααααα ααΆαααααααααα ααΎα ααααα Kafka αα·αααΆααααααααααΆαααΎααα "7 αααα" α ααααα·αααΎαααα»αα’αα‘α»ααααααα αααααα·ααΈαα·αααΆαααα½αααΆαααΆαα½ααα ααααα ααααααα’αααααααΆααΆαααααΎααααα·ααααα·ααΆααααααΆαα α’αααααΉαααα½αααΆα InvalidPidMappingException. αααααΆαααα α’ααααααααααααα½αααααα·ααααα·ααΆαααΉαα αααααααααΆααααααΈαααααΆααααααα·ααααα·ααΆααααααΆααα ααααααΆαααΆααααα ααΆαα’αΆα ααΉαααααΌαααΆααααα ααααα·αααΎ InvalidPidMappingException αα·αααααΌαααΆααααααααααααααΉαααααΌαα
αααα½αα±ααα ααα½αααα»α
ααΌα αααα’αααα’αΆα ααΎαααΆαα·ααααααααααΆαααααααα»αααΆαααααΆααααααααΎααΆααα Kafka α α’αααααααΌαααααΎαααΎαααααααααααΆαααΆαααααα α αΎαααααααααα½αααΎααααΈααααΎααΆαααααΆααααααΌααα ααα αα αααα»αα’αααααααα αααα»αααΆαααααΆααΆααααα αΆααααΆααααα’α·αα’αααΈααΆααααα αααΆαα ααα αΆαααααΆαα α αΎαααΆααα·αααααΆα’αααΈαααα αΆααΆα αααΎαααΆαα½αααΉαααΆαααααααα ααΆαααααααα client.id αα·α transactional.id αααααΎααα½ααααααα ααΆαααααααααααΊααΆααα ααααΈααααααααααΆααααααααααα’αααααα·α αα·αα’αααααααΎααααΆααα
αααα»αα αα»αααα·α:
- acks = ααΆααα’ααα
- ααααΆααΆα > 0
- enable.idempotence = αα·α
- max.in.flight.requests.per.connection β€ 5 (1 αααααΆααααΆαααααΎααΆαααααΆαα)
- transactional.id = ${application-name}-${hostname}
α’αααααααΎααααΆαα:
- isolation.level = read_committed
ααΎααααΈααΆαααααααααα α»ααααααααα»ααααααα·ααΈααΆαααα’ααΆαα ααΎαααΆααααααΎααα»αααααΆαααααα½αααααααΎαααΎααΆαααααααα ααΆαααααααααα·ααΆααααΌα αααααααααααααΆαααααΆαααΆαααααααααααΆαααΆααααααΈαα½αα ααα½αααααΌαααΆαααααααα½α α αΎαα
αααααΊααΆαααααΆαααα½αα ααα½ααααααΆααααΆααα·ααααΆααααααα½αα―αα
KIP-98 - ααααΆαααα ααααααααΆαααΉααααααΌα αα·αααΆαααααΎααΆαααΆαααααα·ααααα·ααΆα ααΆααα·αααααΆα’αααΈααΆαααααα
ααααα: www.habr.com