当前位置: 首页 > 知识库问答 >
问题:

当RabbitMQ消费者崩溃时,获取的消息会发生什么?

桂志新
2023-03-14

如果我有一个RabbitMQ使用者,它可以批量检索100条消息,但它在将这些消息标记为已处理之前崩溃,那么这些消息会丢失吗?我希望队列中的每条消息至少被处理一次。对于在确认信息之前崩溃的消费者,建议采用什么方法来处理?

RabbitMQ是否以某种方式将它们放回队列中,或者我需要做些什么来实现它?

共有2个答案

袁成化
2023-03-14

如果消费者必须确认收到的消息,并且在确认消息之前死亡,则会发生以下情况:

  1. RabbitMQ代理将知道消费者不会确认,因为通道已关闭

如果同一队列有多个使用者,或者RabbitMQ代理版本低于2.7.0,则第3点无效。

希望有帮助。

汪胤
2023-03-14

在消费者确认消息之前崩溃时,推荐的处理方法是什么?

让Rabbitmq为你做一切——未被确认的消息将被重新排队,并将再次传递给另一个(甚至同一个)消费者。

RabbitMQ是否以某种方式将它们放回队列中,或者我需要做些什么来实现它?

见第一个问题的答案。只是在信息被处理之前不要确认。这意味着还要确保未设置自动确认标志!

如果我有一个RabbitMQ使用者,它可以批量检索100条消息,但它在将这些消息标记为已处理之前崩溃,那么这些消息会丢失吗?

见上面的答案——如果他们被自动确认,他们就会丢失
只是一点参考,引用第二篇教程:

如果消费者在未发送ack的情况下死亡(其通道关闭、连接关闭或TCP连接丢失),RabbitMQ将理解消息未被完全处理,并将对其重新排队。如果同时有其他消费者在线,它会很快将其重新提交给其他消费者。这样你就可以确保没有信息丢失,即使工人偶尔死亡。

 类似资料:
  • Kafka过去在我自己的电脑上工作得很好。我正在另一台电脑上工作,上面写着 为目录C:\tmp\kafka logs(kafka.server.LogDirFailureChannel)java中的\uu consumer\u offset-41创建日志时出错。木卫一。IOException:映射在sun失败。尼奥。总经理。Kafka地图(FileChannelImpl.java:940)。日志抽

  • 我对RabbitMQ很陌生,所以如果我的问题听起来很琐碎,请原谅。我想在RabbitMQ上发布消息,它将由RabbitMQ消费者处理。 我的消费者机器是一个多核机器(最好是azure上的工作者角色)。但QueueBasicConsumer一次推送一条消息。我如何编程来利用我可以同时处理多个消息的所有核心。 一种解决方案是在多个线程中打开多个通道,然后在那里处理消息。但在这种情况下,我将如何决定线程

  • 我有一个springboot消费者应用程序。当我第一次运行它时,它消耗了来自Kafka主题的信息。但当我再次运行它时,它停止了消耗。在日志中,我看到以下消息。 我知道消费者无法获得偏移量。在这种情况下,消费者将引用自动偏移重置属性。如您所见,我已将其设置为,希望消费者从头开始阅读。但它没有。 应用程序. yml 在我的Java课上 我尝试了一些东西。 我将值设置为。不出所料,它抛出了一个异常,抱怨

  • 我有一个生产者和一个消费者。消费者的多个实例正在运行。当生产者发布消息时,我的意图是通过所有实例消费该消息。所以,我使用的是直接交换。生产者将带有主题的消息发布到直接交换。消费者正在通过独占队列收听该主题。当消费者启动并且生产者发布消息时,此过程运行良好。但是当消费者关闭并且生产者发布消息时,消费者在启动时不会消费此消息。 我在谷歌上搜索了这个问题。建议使用命名队列。但是,如果使用命名队列,则消息

  • 我有一个场景,我想“拉”RabbitMQ队列/主题的消息,并一次处理一个。特别是当消费者启动时,队列中已经有消息。我尝试了以下方法,但没有成功(这意味着,这些选项中的每一个都会读取队列,直到队列为空,或者直到另一个线程关闭上下文)。 1.第一次处理后立即停止路由 与1类似,但使用闩锁而不是while loop和sleep。 使用轮询消费者 使用ConsumerTemplate()-类似于上面的代码

  • 我有一个制作人发布一个名为“MyTopic”的主题的消息。我有两个不同的消费者组中的两个消费者在听这些消息。我按以下顺序开始这两个消费者和生产者。 1)启动组“GROUP1”中的使用者%1%2)启动生产者以发布数百条消息 过了一段时间,我检查消费者1的偏移量,这与我预期的一样: 输出: 输出: 对于任何其他拥有新消费群体的消费者来说,也存在同样的问题。为什么在消息发布后加入一个新的消费者组的消费者