限制到 rabbitmq 队列的连接数?

Limit number of connections to a rabbit queue?

我在 ubuntu-16.04 上使用 pika-0.10.0rabbitmq-3.6.6 经纪人。我设计了一个 Request/Reply 服务。有一个请求队列,所有客户端都在其中推送他们的请求。每个客户端创建一个唯一的回复队列:服务器将针对该客户端的回复推送到这个唯一的队列。我的API可以看成两条消息:initrun.

init 消息包含大图像,因此 init 是一个大而慢的请求。 run 消息更轻,服务器重用以前的图像。服务器可以为多个客户端提供服务。通常 client#1 init 然后 run 多次。如果 client#2 进来并且 init,它将替换 client#1 在服务器上发送的图像。此外,客户端#1 发出的 run 会使用错误的图像。那我问:

我觉得你的设计有问题。逻辑上每个 run 对应于某个 init 所以它们必须连接。我将关联 ID 字段放入 initrun 事件中。当服务器收到 run 时,它会检查是否有相应的 init 已处理并使用 init 的结果。

说到性能: 您可以创建 init 个工作队列并让多个处理服务器监听它。这个例子在 RabbitMQ docs 然后,当 init 请求进来时,其中一个可用的服务器将拾取它,并存储您的图像和相关 ID。如果您同时有多个 init 请求 - 没问题,它们最终会被处理(或者如果服务器空闲则同时处理)

然后执行该过程的服务器向客户端队列发送回复消息说 init 工作已完成,并发送 run 请求必须发布的队列的名称。

准备就绪后,客户端将其 run 请求发送到正确的队列。

直接回答问题:

有一种常见的误解,认为您发布到 queue。在 RabbitMQ 中,您发布到一个 exchange,它关心将消息路由到多个队列。所以你的问题真的变成了can I limit number of publishing connections to an exchange。我很确定在经纪人方面没有办法这样做。 即使有办法限制连接数,想象一下情况:

  1. Client1 进来,推送它的 'init' 请求。
  2. Client1 保持连接,等待推送 run
  3. Client1出现故障或发生网络分区,连接失败 掉线了。
  4. Client2 进来并推送其 init 请求。
  5. 客户端 2 失败
  6. Client1 重新启动并推送其 run 并获取 Client2 的 图片。

连接是暂时的,不能作为事务机制来依赖。