【发布时间】:2021-09-26 21:33:41
【问题描述】:
在我的 Java 应用程序中,我连接到 2 个不同的 Kafka 集群(比如 C1 和 C2), 目前我向这两个集群(C1 和 C2)发布了相同的消息,如下所示:
firstKafkaTemplate.send(producerRecord);
secondKafkaTemplate.send(producerRecord);
我想以某种事务方式发布消息,以便当消息发布到 C1 时,如果 发布到C2失败,那么消息也不应该发布到C1,应该以某种方式回滚?我们可以实现这种行为吗?
【问题讨论】:
-
添加一个在某个时间段内读取消息的消费者?
-
这有什么帮助?
-
如果消费者没有阅读消息,它就不会被传递到主题。但是重新阅读这个问题,您似乎想在同一时间执行写入,并且如果其中一个失败则希望删除该消息。
-
如果你使用两个集群,这种类型的“跨越事务”是不可能的。 Kafka 记录在生成并确认后无法回滚。不过,您可以为消费者构建逻辑以在外部查找偏移量并跳过任何符合某些条件的事件
-
因为我无法控制消费者应用程序。这就是为什么我一直在寻找我可以在最后做的事情,如果有办法我可以撤消 sendMessage,中止事务,这样消息就不会被发布
标签: spring-boot apache-kafka spring-kafka