2016-06-13 87 views
0

我创建了一个使用RabbitMQ进行消息传递的基本应用程序。消息在一台服务器上发布,然后下游的另一台服务器将有一个消耗信息的长时间运行的进程。现在,我把它设置如下:RabbitMQ/AMQP HA App:消费者死亡/退出后的持续队列?

出版商:

  1. 声明直接交换myexchange
  2. 发布消息myexchange交换路由键payload.routingkey

Co nsumer程序:

  1. 声明直接交换myexchange
  2. 声明队列我的专用队列名称(可选择耐用设置为true
  3. 绑定我的专用队列名称排队到myexchange exchange
  4. 消费消息my-specific-queue-name

我已经有了这个过程运作良好。我遇到的情况是,如果我的消费者程序死亡,似乎发布到myexchange的新消息将丢失,因为没有队列将被绑定到交换机。是否有一种配置,即使消费者程序消失,消息仍然可以排队,以便当消费者程序重新联机时,消息仍然能够被接收?

+0

哪些是您使用的书写语言的客户端? – cantSleepNow

+0

@cantSleepNow为两个客户端使用perl。我正在使用[Net :: RabbitMQ](https://metacpan.org/pod/Net::RabbitMQ)模块。 – Devin

+0

检查声明队列时,什么是“独家”参数的默认值。由于您将“持久”设置为true,因此可能是,如果“排他”为真,那么一旦消费者断开或死亡,队列就会被删除 – cantSleepNow

回答

0

当我写这个问题,我似乎意识到了一个答案,下面公布。当然,如果这是一个糟糕的主意,或者你有另一个建议,那就开除吧。

如果使用默认交换(使用空字符串作为名称进行交换),则可以声明队列并自动将其绑定到此默认交换(请参阅Default Exchange)。所以,你可以在发布声明你我的专用队列名称队列,然后重新声明,并开始在消费者脚本它消耗。在AMQP/RabbitMQ中,您可以多次重新声明事物,只有在它们不存在时才会创建它们。由于您在发布者上声明了队列,因此如果有其他系统正在侦听来自其的消息,则无关紧要。