kafka -如何以容错的方式读取和处理消息?



我是Kafka的新手,我正在尝试理解Kafka消费者如何消费和处理来自Kafka主题的消息而不会丢失消息,如果消费者在之间失败.

例如:

有一个叫做cart_checkout的kafka主题,它只在用户成功结账时保存一个事件。它所做的只是获取一个事件,并向用户发送一封电子邮件,告知他们的物品已被签出。

这是幸福的路径:

  1. Consumer从topic获取事件。
  2. 读取偏移量提交给Kafka。
  3. 消费者调用应用特定功能发送邮件。
  4. 重复。

如果应用程序在Step 3期间失败会发生什么?

如果消费者启动,那么它将错过一个事件,我说的对吗?(因为read消息已提交)

消费者可以倒带,但是它怎么知道要倒带呢?

RabbitMQ解决方案:

在RabbitMQ中似乎更容易解决,因为我们可以控制消息的ack。但是在Kafka中,如果我们提交了read-offset,我们会在应用程序重启时丢失消息,如果我们不提交read-offset,那么相同的消息会被发送给多个消费者.

处理这个问题的最好方法是什么?

正如你所提到的,消费者偏移量也可以手动管理,在这种情况下,你需要避免重复(默认情况下,交付保证至少一次)或丢失你的用例中提到的电子邮件。

要手动控制偏移量,应该禁用自动提交(enable.auto.commit = false)。

现在关于你问题的第二部分,你提到:

如果我们不提交read-offset,那么相同的消息将被发送给多个消费者

这种理解是不完全正确的。在Kafka中,默认情况下每个消费者控制自己的偏移量和消费者在相同的消费者组不共享分区(同一消费者组中的每个消费者从单个分区读取),因此消息不会被同一消费者组中的其他消费者处理(在Kafka消费者轮询消息中),这只会发生在不同消费者组中的消费者身上,但他们也会读取消息,这是Kafka客户端的设计。这也是相关的,你明白消费者投票返回多个消息,默认的commitSync或commitAsync将提交由该投票调用返回的所有消息的偏移量,如果你想避免可能的电子邮件重复,你可能想使用更具体的提交,检查API在这里:https://kafka.apache.org/30/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html

当你正在学习这是一个常见的误解,有一些很好的资源可以阅读,澄清这个概念的免费,我建议官方设计部分的文档:https://kafka.apache.org/documentation/#theconsumer还有这个免费的书籍章节:https://www.oreilly.com/library/view/kafka-the-definitive/9781491936153/ch04.html是具体到你现在正在做什么。好运。

最新更新