【问题标题】:RabbitMQ design advice: Routing DLX message back to originating publisherRabbitMQ 设计建议:将 DLX 消息路由回原始发布者
【发布时间】:2014-11-12 07:48:10
【问题描述】:

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


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

我正在尝试实现一种“发布 TTL”,如果消息是死信,则通知原始发布者(仅)。 (我希望发布者知道消息是否在特定超时内没有被消费)。

我有一个解决方案如下:

  • 发布消息时,每个发布者使用包含唯一(每个发布者)进程 ID 的路由键,例如发布者 3 的“thekey.pid3
  • 每个消费者都从同一个队列中消费,该队列使用路由键 'thekey.#'
  • 绑定到交换器
  • 当发布者声明队列时,我没有为 DLX 明确指定任何路由键 - 只有“x-dead-letter-exchange”。这意味着,如果消息是死信的,那么原始路由密钥(即 'thekey.pid3')将传递到 DLX。
  • 每个发布者使用其特定的路由密钥将其自己的新消费者队列绑定到 DLX,例如'thekey.pid3'

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

然而,这似乎有点令人费解——而且效率低下,因为通配符路由发生在所有消息上(除了那些死信——这通常不应该发生)。

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

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

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

谢谢!

【问题讨论】:

标签: rabbitmq amqp


【解决方案1】:

是的,所以结果证明这个解决方案是非常有效的。使用通配符绑定键和主题交换时可能会有延迟,但可能没有什么可真正关心的。

邮件列表中的一条评论是,由于这是一个基于 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/

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 2022-11-18
    • 2016-06-19
    • 2016-11-24
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多