2010-02-26 55 views
34

据我所知,2个选项可供选择:什么是AMQP中的“传送模式”?

  • “非持久性”
  • “老大难”

但是,这实际上意味着什么呢?

“非持久性”如下:如果没有消费者,AMQP结构将尝试传递消息,则消息将被丢弃?

“持久性”如下:AMQP将重试消息,直到消费者接受它?

回答

26

@jldupont - @nos说的。标记为“持久”的邮件将传递到“持久”队列中,并记录到磁盘中。发生崩溃时持久队列会被恢复,以及在崩溃之前存储的任何持久性消息。有关详细信息,我建议在邮件列表上询问,或者查看rabbitmq网站上的各种背景信息。如果您有任何疑问,请致电联系与我们联系。

干杯

亚历

+0

谢谢亚历克西斯! – jldupont 2010-03-01 14:37:33

+0

我不明白你为什么可以声明Exchange持久。另一方面,你“可以”!?宣布一个队列“对应”该Exchange不耐用?或者,例如,如果您要声明Exchange NONDURABLE,但队列可以持久化,并且会发生崩溃。我可以在非持久性交换中恢复那个持久队列吗? @alexis – Detached 2013-06-27 13:52:38

+2

“持久性”仅意味着Exchange或队列将在服务器重新启动后存活下来。这并不意味着存储在持久队列中的消息将存活下来......这也会要求消息级属性'.deliveryMode = 2' 。 (我只是测试了这些情况) – Myobis 2014-01-06 09:04:38

12

delivery_mode在AMQP确定是否将消息代理重新启动之后被存储在磁盘上。您可以将邮件标记为持久性 - 当你在PHP(PECL AMQP扩展)发布消息 例如通过塞汀delivery_mode property = 2

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

您还需要申报队列耐用(或将经纪人停止后丢弃)

$queue->setFlags(AMQP_DURABLE);