Я не могу комментировать похожие topi c: Префикс TransactionId для записи только для производителя и чтения-процесса-записи - ProducerFencedException , поэтому я задам новый вопрос.
Вариант использования:
- Одна топи c с 2 разделами
- Spring @KafkaListener с параллелизмом = 1 (по умолчанию) в группе потребителей "sample-consumer-group"
- Два экземпляра одного и того же приложения - оба с одинаковым «префиксом-идентификатора транзакции»
1) Я запускаю первый экземпляр приложения (давайте назовем его «instance1» - даже если все в порядке - один потребитель подписывается на оба раздела. Журнал:
o.s.k.l.KafkaMessageListenerContainer : sample-consumer-group: partitions assigned: [sampleTopic-1, sampleTopic-0]
2) Я запускаю второй экземпляр приложения (instance2) - все выглядит нормально - журнал из этого экземпляра:
o.s.k.l.KafkaMessageListenerContainer : sample-consumer-group: partitions assigned: [sampleTopic-1]
log из "instance1":
o.s.k.l.KafkaMessageListenerContainer : sample-consumer-group: partitions revoked: [sampleTopic-1, sampleTopic-0]
o.s.k.l.KafkaMessageListenerContainer : sample-consumer-group: partitions assigned: [sampleTopic-0]
Все еще кажется нормальным ... Но, когда я тогда пытаюсь отправить сообщение на любой другой topi c (не из kafkaListener, а из некоторый метод @Transactional - так что это только транзакция производителя) следующие ошибки oc cur:
ERROR 4395 --- [roducer-tx-prefix-0] o.a.k.clients.producer.internals.Sender : [Producer clientId=producer-tx-prefix-0, transactionalId=tx-prefix-0] Aborting producer batches due to fatal error
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.
ERROR 4395 --- [roducer-tx-prefix-0] o.s.k.support.LoggingProducerListener : Exception thrown when sending a message with key='sync-register' and payload='2020-04-21T13:52:12.148412Z' to topic anotherTopic
Так это связано с проблемой, что у меня должен быть отдельный префикс-идентификатора транзакции для каждого экземпляра для транзакций только производителя? Если да, каков текущий статус этого и как этого добиться, не используя отдельный kafkaTemplate для транзакций, запущенных потребителем и запущенных производителем?