我有一个Spring Kafka应用程序,它有一个生产者,它不是纯kafka消费->流程->生产链的一部分,即生产者不是由kafka消费者触发的。
根据我目前对 Kafka 的 Zombie fencing 功能的理解,我希望这个生产者始终使用相同的 transactional.id,因此,如果该应用程序的新实例启动,所有旧实例都会被隔离。
现在 Spring Kafka 文档说,DefaultKafkaProducerFactory 维护着生产者的缓存,这些生产者的 transactional.ids 之间有一个整数后缀的不同。我不清楚在什么情况下我最终会得到一个具有不同 transactional.id 的生产者,以及是否有可能使用 Spring Kafka 实现旧应用程序实例的可靠防护。
非常感谢任何澄清。
需要缓存支持多线程(不能在不同线程上同时使用同一个事务生产者);如果您只使用一个线程(或确保发送受到锁或同步的控制),则只会有一个事务生产者。
如果您想要不同的行为,您可以创建自己的
ProducerFactory
实现(但关于多线程,您仍然会遇到相同的问题)。