【问题标题】:Can we Rollback kafka message我们可以回滚 kafka 消息吗
【发布时间】: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


【解决方案1】:

Kafka 不支持分布式事务(也称为 XA 事务),因此您不能简单地在一个大事务中写入两个集群并能够回滚。

如果您根本不想更改消费者,可以考虑只写入第一个集群,并使用MirrorMaker 或类似工具将消息从一个主题复制到下一个主题。如果第二个集群写入消息失败,MirrorMaker会重试,直到可以写入消息为止。

如果第二个集群无法接收消息,您还可以考虑监控第二个集群并禁用向第一个集群生成消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-07
    • 2020-11-14
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多