卡夫卡/ RabbitMQ中的每个消息确认

时间:2019-03-02 21:42:49

标签: apache-kafka rabbitmq producer-consumer

由于数量庞大,我们有一个正在工作的Rabbitmq .implementation,我们计划改用kafka。

我对此有疑问。

在RabbitMQ中,当消费者使用来自Q的消息时,消息进入另一个阶段,即未确认的阶段。客户端/消费者需要一些时间来处理该消息,成功处理后,它将向Q发送确认,并且消息将从Q中删除。如果不成功,则在定义的时间段后如果Q没有得到确认,则消息为附加在Q的末尾。这样我们就不会丢失任何消息。

用我对Kafka的一点了解,我了解到,例如,如果消息100未成功处理,则偏移量不会增加,但如果消息101被成功处理,则偏移量会增加。因此我丢失了消息100。

有没有一种方法可以确保所有消息都不会丢失。

4 个答案:

答案 0 :(得分:1)

Kafka不会删除主题中的消息,除非它到达log.retention.bytes log.retention.hours log.retention.minutes log.retention.ms配置之一。因此,如果偏移增加,则不会丢失以前的消息,您只需将偏移更改为所需位置即可。

答案 1 :(得分:1)

我也面临着同样的问题。如果我想简单地说,RabbitMQ会保留每个计数

  1. 已发布但未使用
  2. 已发布,已使用和未确认的消息。

Kafka没有,所以您无法完成它的制作,您必须自己实现。

虽然有可用的选项,但使用kmq时,性能将低于50%,请看一下

https://softwaremill.com/kafka-with-selective-acknowledgments-performance/

答案 2 :(得分:0)

除非您轮询新消息,否则您的消息偏移量不会增加。因此,您必须担心重新处理邮件。

如果要将数据处理的结果存储到Kafka集群,则可以使用transaction feature of Kafka。这样,您就可以支持一次交货。您所有的更改都将被保存,或者不保存任何更改。

另一种方法是使处理方案成为幂等。您将为Kafka中的每条消息分配一个唯一的ID。处理消息时,会将ID存储在数据库中。崩溃后,您可以通过查看数据库来检查您的消息ID是否已处理。

答案 3 :(得分:0)

您应该阅读一些有关Kafka中消息消费的工作方式的信息。以下是指向Kafka官方文档的消费者部分的链接:https://kafka.apache.org/documentation/#theconsumer

基本上,在Kafka中,只有经过足够的时间后才会删除邮件,就像@Amin所说的那样,使用log.retention.hourslog.retention.minuteslog.retention.ms进行配置。

在Kafka中,任何数量的使用者都可以在任何时候开始使用任何主题的消息,而不管其他使用者是否已经在使用同一主题。 Kafka使用存储在Kafka本身中的偏移量跟踪每个用户在每个主题/分区上的位置。因此,如果您的消费者需要消费消息100(如您在问题中所述),则可以简单地“倒带”到所需消息,然后再次开始正常消费。无论您以前是否消费过它,或者其他消费者是否正在阅读该主题都没有关系。

来自Kafka的官方文档:

  

消费者可以故意倒退到旧的胶印,   重新使用数据。这违反了队列的通用协定,但是   事实证明,这是许多消费者的基本功能。例如,   如果使用者代码有错误,并且在某些消息后被发现   被消耗掉后,消费者可以在错误发生后重新使用这些消息   是固定的。