【发布时间】:2018-12-23 20:50:51
【问题描述】:
在我们的项目中,我们需要通过多个线程定期从 3rd 方获取数据,然后将这些数据推送到 Kafka。如果此时 Kafka 服务器不可用,则应终止流程,获取的数据应丢失并在下一次计划执行期间重新获取。此外,还需要使用事务管理,因为我们需要将这批消息发送到 Kafka 到不同的主题。如果没有发送一条消息,则应回滚所有其他消息。
如果 Kafka 服务器不可用,我们会遇到终止执行的问题。当事务管理被禁用时,一切正常,我们得到了
org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.
但是启用事务管理后,Kafka 生产者会尝试无限地访问服务器,并且所有启动将消息推送到 Kafka 的线程都会卡住。我们尝试了不同的设置以使其在一段时间不可用后失败,但没有帮助。
设置spring.kafka.producer.retries: 0 或spring.kafka.producer.acks: 0 导致(不是完整的堆栈跟踪):
Caused by: org.apache.kafka.common.config.ConfigException: Must set retries to non-zero when using the idempotent producer.
Caused by: org.apache.kafka.common.config.ConfigException: Must set acks to all in order to use the idempotent producer. Otherwise we cannot guarantee idempotence.
当 Kafka 服务器不可用且启用事务管理时,是否有一些设置组合使 Kafka Producer 在超时后失败?这可能吗?
【问题讨论】:
标签: java apache-kafka spring-kafka