因此,我一直在阅读有关kafka的一次语义的信息,而我对它的工作方式有些困惑。
我了解生产者如何避免发送重复的消息(以防经纪人的确认失败),但是我不明白的是,在消费者处理消息但在提交之前崩溃的情况下,一次精确的工作原理偏移量。卡夫卡在那种情况下不会重试吗?
答案 0 :(得分:3)
这是我认为的意思:
这是完全可能的。但是,要使kafka一次“起作用”,您的所有副作用(状态,输出)也必须进入相同的kafka群集。所以这是要发生的事情:
如果您在同一个kafka集群之外有副作用(例如,不是在记录Z中插入一行,而是在mysql中插入行),则没有通用的方法可以使kafka一次正常工作。您需要依靠老式的重复性和幂等性。
答案 1 :(得分:0)
Radal在回答中很好地解释了这一点,仅在孤立的Kafka集群中一次。
在处理外部数据库(至少是事务性的)时,一种简单的实现一次精确的方法是更新一行(在sgbd事务中),并附上您的业务价值以及它来自的分区/偏移量。这样,如果您的消费者在提交给Kafka之前崩溃了,您将能够获取它处理过的最后一个Kafka偏移量(通过使用Consumer.seek())
尽管在sgbd中可能是相当大的数据开销(为所有行保留偏移量/分区),但是您可能可以进行一些优化。
Yannick