对 Kafka 的一次性语义感到困惑

2024-04-04

所以我一直在阅读关于卡夫卡的一次语义,我对它的工作原理有点困惑。

我了解生产者如何避免发送重复消息(以防来自代理的确认失败),但我不明白的是,在消费者处理消息但在提交偏移量之前崩溃的情况下,exactly-once 是如何工作的。在这种情况下kafka不会重试吗?


这就是我think你的意思是:

  1. 消费者 X 看到记录 Y,并对其进行“操作”,但不提交其偏移量
  2. 消费者 X 崩溃(仍然没有提交其偏移量)
  3. 消费者 X 启动备份,被重新分配相同的分区(不保证)并最终再次看到记录 Y

这是完全可能的。然而,对于 kafka 来说,只有一次“工作”,所有副作用(状态、输出)也必须进入同一个 kafka 集群。所以接下来会发生什么:

  1. 消费者X开始一笔交易
  2. 消费者 X 看到记录 Y,发出一些输出记录 Z(作为 1 中开始的事务的一部分)
  3. 消费者 X 崩溃。在充当事务协调器的代理“回滚”(简化)之后不久,事务从 1 开始,这意味着其他 kafka 消费者将不会看到记录 Z
  4. 消费者 X 启动备份,被分配与之前相同的分区,启动新事务
  5. 消费者 X 再次看到记录 Y,发出记录 Z2(作为 4 中开始的事务的一部分)
  6. 一段时间后,消费者 X 提交其偏移量(作为 4 中事务的一部分),然后提交该事务
  7. 记录 Z2 对下游消费者可见。

如果你在同一个 kafka 集群之外有副作用(比如你在 mysql 中插入一行而不是记录 Z),那么没有通用的方法可以让 kafka 一次性为你工作。您需要依靠老式的重复数据删除和幂等性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对 Kafka 的一次性语义感到困惑 的相关文章

随机推荐