繁体   English   中英

限制到兔子队列的连接数?

[英]Limit number of connections to a rabbit queue?

我在ubuntu-16.04 rabbitmq-3.6.6 pika-0.10.0rabbitmq-3.6.6代理一起使用。 我设计了一个请求/回复服务。 所有客户端都推送他们的请求的是一个“请求”队列。 每个客户端都创建一个唯一的Reply队列:服务器将针对此客户端的回复推送到此唯一队列。 我的API可以看作两条消息: initrun

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

  • 是否可以限制连接到队列的数量? 例如,服务器一次服务一个客户端。
  • 另一个选择是:服务器将图像绑定到客户端,保存它们,然后在该客户端运行时重新使用它们。 它需要更多的工作,并且如果两个或多个客户的请求紧密交错,将会影响性能。
  • 在每个运行请求中发送图像不是一种选择,这太慢了。

我认为您的设计有问题。 从逻辑上讲,每个run对应于某个init因此必须将它们连接起来。 我将相关ID字段放入initrun事件中。 当服务器接收run它将检查是否已处理了相应的init并使用该init的结果。

谈到性能:您可以使init worker队列并使多个处理服务器监听它。 该示例在RabbitMQ文档中。然后,当发出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. Client2失败
  6. Client1重新启动并推动其run并获取Client2的映像。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM