RabbitMQ设计建议:将DLX消息路由回原始发布者

时间:2014-11-12 07:48:10

标签: rabbitmq amqp


编辑:基本要求是我有多个Web服务服务器进程接收来自Web服务客户端的请求,执行一些处理(我想使用工作队列),然后将结果返回给相应的客户端。但是,我希望能够等待此队列的消费者获取已发布的请求,在超时内。如果此超时到期,那么我希望原始Web服务进程收到此通知,以便它可以反馈给客户端。


  • 我有多个发布商向同一个交易所发布消息
  • 此交换机上有多个消费者在同一个队列中消费,即“任务队列”

我尝试实施某种“发布TTL”,如果邮件是无效的,则会通知始发发布者(仅限)。 (我希望发布者知道在某个超时时间内是否没有使用该消息)。

我有一个解决方案如下:

  • 发布消息时,每个发布者使用包含唯一(每个发布者)进程ID的路由密钥,例如, '的 thekey.pid3 '出版商3
  • 每个消费者都使用相同的队列消费,该队列使用路由密钥' 密钥绑定到交换机。# '
  • 当发布商声明队列时,我没有明确指定DLX的任何路由密钥 - 只有' x-dead-letter-exchange '。这意味着如果消息被破坏,则原始路由密钥(即' thekey.pid3 ')将继续传送到DLX。
  • 每个发布者使用它的特定路由密钥将其自己的新消费者队列绑定到DLX,例如, '的 thekey.pid3 '

所以这解决了我的要求,因为只有发布消息的发布者才会将DLX消息路由到它。

然而,这看起来有点复杂 - 并且效率低下,因为所有消息都会出现通配符路由(除了那些死信 - 除非正常正在发生)。

这必须是一个常见的要求 - 我的解决方案是否可取?有没有更有效的方法来做到这一点?还是我走在正确的轨道上?

这是显示我的设计的图表:

编辑: 在下图中,DLX实际上应该连接到队列,而不是Exchange! DLX back to originating publisher

谢谢!

1 个答案:

答案 0 :(得分:0)

是的,事实证明解决方案非常有效。使用通配符绑定密钥和主题交换时,可能会有延迟命中,但可能没有什么值得关注的。

邮件列表中的一条评论是因为这是一个基于RPC的系统,每个发布者已经都定义了一个唯一的响应队列,因此可以将该队列绑定到DLX(而不是创建一个新的,每个发布者的唯一队列),从而使两者都有效'响应和死信消息传递到同一队列。

就我而言,我想把它包起来发布TTL'通用发布者的功能,所以引用响应队列没有意义 - 虽然我的解决方案可能效率稍低,因为如果死信还有一次往返。

如果您对Rabbit的人员用于主题路由的机制感兴趣,您可以查看: http://www.rabbitmq.com/blog/2010/09/14/very-fast-and-scalable-topic-routing-part-1/ http://www.rabbitmq.com/blog/2011/03/28/very-fast-and-scalable-topic-routing-part-2/