AMQP中的“delivery mode”是什么?

81
我了解有两个选项:
  • "非持久化"
  • "持久化"
但这意味着什么呢?
"非持久化"是指:如果没有消费者,AMQP Fabric将尝试传递消息,否则消息将被丢弃。
"持久化"是指:如果没有消费者接受消息,AMQP将重试传递该消息。
3个回答

76

标记为“持久性”的消息,如果发送到“持久性”队列,将被记录在磁盘上。 在崩溃事件中,可以恢复“持久性”队列以及崩溃前存储的任何持久性消息。


我不明白为什么可以声明一个持久化的Exchange。而另一方面,你“可以”声明一个与该Exchange不持久化“对应”的队列?或者例如,如果您声明了一个非持久化的Exchange但是一个持久化的队列,并且发生了崩溃。我能在不持久化的Exchange中恢复那个持久化的队列吗?@alexis - noBillSide
15
“durability”只是表示在服务器重新启动后,Exchange或Queue将能够存活。这并不意味着存储在持久化队列中的消息将会存活下来……为了实现这一点,还需要一个消息级别的属性“.deliveryMode = 2”。(我刚刚测试过这些情况) - Myobis

24

delivery_mode 是 AMQP 中的一个选项,用于决定经纪人重启后是否将消息存储在磁盘上。您可以通过设置 delivery_mode 属性为 2 来将消息标记为持久化,以便在发布消息时保留其状态。

$exchange->publish($text, $routingKey, null, array('delivery_mode' => 2));

你还需要将队列声明为持久化的(否则在代理停止后它将被删除)

$queue->setFlags(AMQP_DURABLE);

1
它们在被处理后是否会继续存储在磁盘上?还是只能保证它们在被处理之前会被持久化存储? - cs_pupil

0

传递模式的值将告诉RabbitMQ,当消息放置在队列中时,它是否被允许在内存中保留消息(非持久化),还是必须先将消息存储在磁盘上(持久化)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接