限制到 rabbitmq 队列的连接数?
Limit number of connections to a rabbit queue?
我在 ubuntu-16.04 上使用 pika-0.10.0
和 rabbitmq-3.6.6
经纪人。我设计了一个 Request/Reply 服务。有一个请求队列,所有客户端都在其中推送他们的请求。每个客户端创建一个唯一的回复队列:服务器将针对该客户端的回复推送到这个唯一的队列。我的API可以看成两条消息:init
和run
.
init
消息包含大图像,因此 init
是一个大而慢的请求。 run
消息更轻,服务器重用以前的图像。服务器可以为多个客户端提供服务。通常 client#1 init
然后 run
多次。如果 client#2 进来并且 init
,它将替换 client#1 在服务器上发送的图像。此外,客户端#1 发出的 run
会使用错误的图像。那我问:
- 是否可以限制队列的连接数? 例如服务器一次为一个客户端服务。
- 另一种选择是:服务器将图像绑定到客户端,保存它们,并在该客户端 运行s 时重新使用它们。它需要更多的工作,如果两个或多个客户端的请求紧密交错,将会影响性能。
- 在每个 运行 请求中发送图像不是一个选项,会太慢。
我觉得你的设计有问题。逻辑上每个 run
对应于某个 init
所以它们必须连接。我将关联 ID 字段放入 init
和 run
事件中。当服务器收到 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
。我很确定在经纪人方面没有办法这样做。
即使有办法限制连接数,想象一下情况:
- Client1 进来,推送它的 'init' 请求。
- Client1 保持连接,等待推送
run
。
- Client1出现故障或发生网络分区,连接失败
掉线了。
- Client2 进来并推送其
init
请求。
- 客户端 2 失败
- Client1 重新启动并推送其
run
并获取 Client2 的
图片。
连接是暂时的,不能作为事务机制来依赖。
我在 ubuntu-16.04 上使用 pika-0.10.0
和 rabbitmq-3.6.6
经纪人。我设计了一个 Request/Reply 服务。有一个请求队列,所有客户端都在其中推送他们的请求。每个客户端创建一个唯一的回复队列:服务器将针对该客户端的回复推送到这个唯一的队列。我的API可以看成两条消息:init
和run
.
init
消息包含大图像,因此 init
是一个大而慢的请求。 run
消息更轻,服务器重用以前的图像。服务器可以为多个客户端提供服务。通常 client#1 init
然后 run
多次。如果 client#2 进来并且 init
,它将替换 client#1 在服务器上发送的图像。此外,客户端#1 发出的 run
会使用错误的图像。那我问:
- 是否可以限制队列的连接数? 例如服务器一次为一个客户端服务。
- 另一种选择是:服务器将图像绑定到客户端,保存它们,并在该客户端 运行s 时重新使用它们。它需要更多的工作,如果两个或多个客户端的请求紧密交错,将会影响性能。
- 在每个 运行 请求中发送图像不是一个选项,会太慢。
我觉得你的设计有问题。逻辑上每个 run
对应于某个 init
所以它们必须连接。我将关联 ID 字段放入 init
和 run
事件中。当服务器收到 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
。我很确定在经纪人方面没有办法这样做。
即使有办法限制连接数,想象一下情况:
- Client1 进来,推送它的 'init' 请求。
- Client1 保持连接,等待推送
run
。 - Client1出现故障或发生网络分区,连接失败 掉线了。
- Client2 进来并推送其
init
请求。 - 客户端 2 失败
- Client1 重新启动并推送其
run
并获取 Client2 的 图片。
连接是暂时的,不能作为事务机制来依赖。