由于数量庞大,我们有一个正在工作的Rabbitmq .implementation,我们计划改用kafka。
我对此有疑问。
在RabbitMQ中,当消费者使用来自Q的消息时,消息进入另一个阶段,即未确认的阶段。客户端/消费者需要一些时间来处理该消息,成功处理后,它将向Q发送确认,并且消息将从Q中删除。如果不成功,则在定义的时间段后如果Q没有得到确认,则消息为附加在Q的末尾。这样我们就不会丢失任何消息。
用我对Kafka的一点了解,我了解到,例如,如果消息100未成功处理,则偏移量不会增加,但如果消息101被成功处理,则偏移量会增加。因此我丢失了消息100。
有没有一种方法可以确保所有消息都不会丢失。
答案 0 :(得分:1)
Kafka不会删除主题中的消息,除非它到达log.retention.bytes
log.retention.hours
log.retention.minutes
log.retention.ms
配置之一。因此,如果偏移增加,则不会丢失以前的消息,您只需将偏移更改为所需位置即可。
答案 1 :(得分:1)
我也面临着同样的问题。如果我想简单地说,RabbitMQ会保留每个计数
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.hours
,log.retention.minutes
和log.retention.ms
进行配置。
在Kafka中,任何数量的使用者都可以在任何时候开始使用任何主题的消息,而不管其他使用者是否已经在使用同一主题。 Kafka使用存储在Kafka本身中的偏移量跟踪每个用户在每个主题/分区上的位置。因此,如果您的消费者需要消费消息100(如您在问题中所述),则可以简单地“倒带”到所需消息,然后再次开始正常消费。无论您以前是否消费过它,或者其他消费者是否正在阅读该主题都没有关系。
来自Kafka的官方文档:
消费者可以故意倒退到旧的胶印, 重新使用数据。这违反了队列的通用协定,但是 事实证明,这是许多消费者的基本功能。例如, 如果使用者代码有错误,并且在某些消息后被发现 被消耗掉后,消费者可以在错误发生后重新使用这些消息 是固定的。