RabbitMQ Publish/Subscribe 与轮询
RabbitMQ Publish/Subscribe vs polling
我在我的应用程序中使用 RabbitMQ 在客户端和服务器之间进行通信。
大多数时候,客户端向服务器发送信息。但有时客户端需要了解服务器中的一些更新。
目前我正在使用 1 分钟间隔的轮询来询问服务器是否有一些更新。
我的问题是,使用 Publish/Subscribe 机制来 "push" 更新客户端会更好吗?
我有大量客户(大约 10000 个)。那么开10000个队列可以吗,每个client一个?
'Better' 是一个相对术语,因此很难说哪个更适合您。但是,队列旨在高效且大规模地处理这种事件驱动的系统。 RabbitMQ 文档讨论了使用 fanout
exchange 来处理您的情况。
在队列上使用事件的好处是可以消除不必要的工作(例如,在没有有效负载时进行轮询),并减少延迟(您当前的系统会引入长达一分钟的延迟)。在具有轮询层的系统中,延迟可能尤其成问题,这会使数据延迟超出程序员最初的预期。
来自 RabbitMQ 文档:
消费者
将消息存储在队列中是无用的,除非应用程序可以使用它们。在 AMQP 0-9-1 模型中,应用程序有两种方法可以做到这一点:
订阅以将消息传递给他们(“push API”):这是推荐的选项
轮询(“pull API”):这种方式效率很低,大多数情况下应该避免
使用“push API”,应用程序必须表明有兴趣使用来自特定队列的消息。当他们这样做时,我们说他们注册了一个消费者,或者简单地说,订阅了一个队列。每个队列可以有多个消费者或注册一个独占消费者(在消费时从队列中排除所有其他消费者)。
每个消费者(订阅)都有一个称为消费者标签的标识符。它可用于取消订阅消息。消费者标签只是字符串。
我在我的应用程序中使用 RabbitMQ 在客户端和服务器之间进行通信。
大多数时候,客户端向服务器发送信息。但有时客户端需要了解服务器中的一些更新。
目前我正在使用 1 分钟间隔的轮询来询问服务器是否有一些更新。
我的问题是,使用 Publish/Subscribe 机制来 "push" 更新客户端会更好吗?
我有大量客户(大约 10000 个)。那么开10000个队列可以吗,每个client一个?
'Better' 是一个相对术语,因此很难说哪个更适合您。但是,队列旨在高效且大规模地处理这种事件驱动的系统。 RabbitMQ 文档讨论了使用 fanout
exchange 来处理您的情况。
在队列上使用事件的好处是可以消除不必要的工作(例如,在没有有效负载时进行轮询),并减少延迟(您当前的系统会引入长达一分钟的延迟)。在具有轮询层的系统中,延迟可能尤其成问题,这会使数据延迟超出程序员最初的预期。
来自 RabbitMQ 文档:
消费者 将消息存储在队列中是无用的,除非应用程序可以使用它们。在 AMQP 0-9-1 模型中,应用程序有两种方法可以做到这一点:
订阅以将消息传递给他们(“push API”):这是推荐的选项 轮询(“pull API”):这种方式效率很低,大多数情况下应该避免 使用“push API”,应用程序必须表明有兴趣使用来自特定队列的消息。当他们这样做时,我们说他们注册了一个消费者,或者简单地说,订阅了一个队列。每个队列可以有多个消费者或注册一个独占消费者(在消费时从队列中排除所有其他消费者)。
每个消费者(订阅)都有一个称为消费者标签的标识符。它可用于取消订阅消息。消费者标签只是字符串。