Кафка - разные КафкаПроизводители в одной транзакции - PullRequest
0 голосов
/ 08 октября 2019

Для целей миграции нам нужно создать записи, используя два разных сериализатора и, следовательно, два разных KafkaProducers (один String и один Avro) в одной транзакции. Но все транзакции выполняются через один экземпляр KafkaProducer следующим образом:

kafkaProducer.beginTransaction();
...
kafkaProducer.send(record);
...
kafkaProducer.commitTransaction();

Могу ли я использовать второй kafkaProducer (со вторым сериализатором) и использовать тот же транзакционал.id и сделать так:

kafkaProducer.beginTransaction();
...
kafkaProducer.send(record);
kafkaProducer2.send(record);
...
kafkaProducer.commitTransaction();

Все будут частью одной транзакции, все непротиворечивы?

РЕДАКТИРОВАТЬ 1:

Согласно тому, что я видел в реализации Java, при вызове commitTransaction существует некоторый механизм() как вызов flush () для самого производителя ... так что я думаю, что приведенная выше модель не сработает ... Есть ли шанс достичь этого без создания полного нового экземпляра всего параллельно?

1 Ответ

0 голосов
/ 08 октября 2019

Одновременно в транзакции может быть активен только один производитель.

Если запустить двух производителей с одинаковым transactional.id, один из них будет огражден и не сможет зафиксироватьего записи и все записи не будут являться частью одной и той же транзакции.

Вам необходимо использовать одного производителя, и один из возможных обходных путей - настроить его на использование BytesSerializer и обработать преобразование вашего * 1007. * в байтах в вашей логике явно.

...