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

当rabbitmq-server崩溃时,rabbitmq服务器会恢复标记为持久队列的消息吗?

邴奇逸
2023-03-14

我正在翻阅Rabbitmq官方站点给出的AMQP的文档。上面说

但是,当Message broker崩溃时,我对以下情况感到困惑:-

  1. 消息由生产者传递到消息交换,但不路由到标记为持久的队列。
  2. 消息由生产者传递给消息交换,消息交换又路由到标记为持久的队列,但消息在队列中,使用者不使用。
  3. 消息由生产者传递到消息交换,消息交换继而路由到标记为持久的队列,但消息在队列中并由使用者使用,但使用者未向队列发送确认。

在上述所有情况下,下一次启动rabbit-mq服务器时,消息是否可用?

此外,文档对普通消息和持久消息进行了区分,因为只有持久消息才会被恢复。这两种消息类型有什么区别?

提前道谢。

共有1个答案

梁英喆
2023-03-14

持久队列将在代理重新启动后保持不变。这意味着重新启动后,队列将自动重新创建,而不需要再次手动创建。这只确保队列将继续现有的消息,而不是它包含的任何消息。

现在,持久消息一到达队列就会被写入磁盘,这与队列无关(是否持久)。

所以回答你的问题。如果您希望您的消息在重新启动后恢复,请声明它们始终是持久性的。假设这样,您的场景将是:

  1. 消息将丢失,因为它尚未到达队列。
  2. 消息将被恢复,因为它已到达队列。
  3. 消息将被恢复并再次发送,当消息再次传递时(不管是传递给同一个使用者还是另一个使用者),消息上带有redelivered标志。这是一个提示,表明消费者以前可能看到过此消息。

注意,持久消息在非持久队列中不起作用;当服务器重新启动时,将不会重新创建队列,因此也不会从持久日志文件中重新创建消息。对于消息可能被路由到的每个非持久队列也是如此:一旦消息被路由到非持久队列,它就会从持久日志文件中删除,不再被认为是持久的。

 类似资料:
  • 在队列选项卡的rabbitMQ web界面上,我看到了“概述”面板,我在其中找到了以下内容: 排队消息: 准备好了 未确认 总数 我猜“总数”是多少。但什么是“准备就绪”和“未确认”?“准备好了”——传递给消费者的信息?“未确认”-? 消息费率: 发表 交付 重新交付 承认 这些信息是什么?尤其是“重新交付”和“确认”?这是什么意思?

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

  • 我对Spring和RabbitMQ有以下配置: 为了防止这种情况,我想创建持久队列(因为这些队列的持久度设置为false,自动删除设置为true)。如果不是,我想在这些队列上设置一些过期时间(例如,1小时或其他时间)。从RabbitMQ文档来看,我们似乎可以在头中传递这些值,但是,这只适用于版本3.6.0以后的版本,因为我们有3.5.4,它不是一个选项。 有没有其他方法可以配置它?(另一种方法是为

  • 我发送消息从JavaSpring Boot应用程序到消费者是Python应用程序。 除了输入命令rabbitmqctl list\u queues时,一切正常,它显示视频队列0,这意味着队列中没有消息。 消费者正在接收消息并执行一些长过程;所以如果我连续发送多条消息,应该会有一些消息在队列中等待。我说得对吗? 制片人: 消费者 在哪里可以看到我声明的队列上的消息?因为虽然我知道队列中有消息,但使用

  • 问题内容: 我们正在使用amqplib来发布/使用消息。我希望能够读取队列中的消息数(理想情况下是已确认和未确认)。这将使我能够向管理员用户显示良好的状态图,并检测某个组件是否无法满足负载需求。 我在amqplib文档中找不到有关读取队列状态的任何信息。 有人可以指出我正确的方向吗? 问题答案: 使用皮卡: 使用PyRabbit: 使用HTTP 句法: 例: 注意:默认虚拟主机是需要转义为 使用C

  • 我们开发的NMS产品已经被几家电信运营商部署。我们的应用程序(使用ActiveMQ)将向故障队列发布故障通知,消息被设置为持久性。这些消息由第三方JMS客户机使用。并不是所有的客户都有通知客户端来使用事件(有些部署没有任何订阅)。问题是,如果队列从来没有订阅服务器连接到队列,ActiveMQ是否会持久化消息?。