【发布时间】: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 official user group
-
谢谢扎克。我已经编辑了这个问题,简要概述了基本的 BL 要求,以防万一。不过我也会把这个发到兔子群里。
-
关于这个问题的 RabbitMQ 邮件列表讨论在这里:groups.google.com/d/msg/rabbitmq-users/xVsSV5R1sk8/DxpN-sbYhBIJ