RabbitMQ发布/订阅与轮询

时间:2015-09-27 04:03:41

标签: rabbitmq publish-subscribe

我在我的应用程序中使用RabbitMQ进行客户端和服务器之间的通信。

大多数情况下,客户端会向服务器发送信息。但有时客户端需要了解服务器中的某些更新。

目前我在1分钟的时间间隔内使用轮询来询问服务器是否有更新。

我的问题是,使用发布/订阅机制来推动"推送"更新客户?

我有大量的客户(大约10000)。那么可以打开10000个队列,每个客户端一个吗?

2 个答案:

答案 0 :(得分:3)

'更好的'是一个相对的术语,所以对你来说更好的方法很难说。但是,队列被设计为有效且大规模地处理这种事件驱动系统。 RabbitMQ文档讨论了如何使用fanout exchange处理您的案例。

使用队列上的事件可以消除不必要的工作(例如,在没有有效负载时进行轮询),并减少延迟(您当前的系统会引入长达一分钟的延迟)。在具有轮询层的系统中,延迟可能特别成问题,这可能会使数据延迟远远超出程序员最初的预期。

答案 1 :(得分:0)

来自RabbitMQ文档:

消费者 除非应用程序可以使用它们,否则将消息存储在队列中是没有用的。在AMQP 0-9-1模型中,应用程序有两种方法可以做到这一点:

订阅以将消息传递给他们(“推送API”):这是推荐的选项 轮询(“拉API”):这种方式效率很低,在大多数情况下应避免使用 使用“推送API”,应用程序必须表明有兴趣使用特定队列中的消息。当他们这样做时,我们说他们注册了一个使用者,或者简单地说,订阅了一个队列。每个队列可能有一个以上的使用者,或者注册一个排他的使用者(在使用队列时,从队列中排除所有其他使用者)。

每个消费者(订阅)都有一个称为消费者标签的标识符。它可以用于退订消息。消费者标签只是字符串。