Gir*_*ish 0 apache-kafka kafka-transactions-api
我们如何确保 Kafka 在读过程场景中的精确一次语义。read 意味着我们正在从 Kafka 主题中读取数据并进行一些处理,然后我们尝试提交偏移量。假设我们处理了消息,但无法提交,并且在提交之前进程崩溃了。重新启动后,再次尝试使用相同的消息。那么如何处理这样的场景呢?这可以用 Kafka Transaction API 来处理吗?
有类似的问题,但无法正确理解它,也留下了很少的评论。只是想确认我的理解。 对 Kafka 的一次性语义感到困惑
Kafka Transaction 为消费-处理-生产场景提供 EOS。这个一次性过程的工作原理是由生产者而不是消费者提交偏移量。即,结果的生成到kafka并提交消费的消息都是由kafka生产者(而不是单独的kafka消费者和生产者)完成的,这带来了恰好一次。kafka 事务中的 EOS 确保对于每一条消费的消息,我们在 kafka 上只有一个结果(该结果可能包含多条消息),但在故障情况下该消息可能会被多次处理。
所以你不能在读取过程中精确地实现一次。您可以使用的唯一解决方案是使您的消息具有幂等性,并以某种方式更改您的业务逻辑,使重复的消息不会产生副作用。例如:
- 如果您使用数据库并在插入或处理并删除传入消息之前检查重复值,则使用重复数据删除过程。
- 在某些重复影响数据库的情况下,我们可以将偏移量提交到数据库,从而使数据插入和偏移量提交在一个事务中进行。