使用RabbitMQ,是否有办法将消息从队列“推送”到消费者,而不是让消费者从队列中“轮询和拉取”消息?
这是我正在进行的一个当前项目辩论的原因。一方面的论点是,让消费者(即Windows服务)“轮询”队列直到新消息到达,这比将消息从队列“自动”推送到订户的想法有些低效且不太理想。 /消费者(一个或多个)。
我似乎只能找到支持消费者从队列中“轮询和拉出”消息的想法的信息(例如,使用Windows服务来轮询队列中的新消息)。关于将消息“推送”给消费者/订户的想法没有太多信息......
答案 0 :(得分:8)
将服务器推送消息发送到客户端是向客户端发送消息的两种方法之一,也是大多数应用程序的首选方式。这通过订阅称为消费消息。
客户端已连接。 (AMQP / RabbitMQ /大多数消息传递系统模型是客户端始终连接 - 当然除了网络中断。)
您使用客户端API通过提供回调方法来安排您的频道使用消息。然后,只要有消息可用,服务器就通过通道将其发送到客户端,客户端应用程序通过异步回调(通常每个通道一个线程)获取它。您可以设置"预取计数"在通道上控制客户端可以通过该通道执行的流水线操作量。 (为了进一步并行化,应用程序可以在一个连接上运行多个通道,这是一种用于各种目的的常见设计。)
另一种方法是让客户端通过 get 方法一次一个地轮询一条消息。
答案 1 :(得分:0)
有点迟到的答案......然而,您将“生产者”中的消息“推送”到Exchange。 https://www.rabbitmq.com/tutorials/tutorial-three-python.html
BTW这非常适合物联网场景。设备会生成消息并将其发送给exchnage。队列正在处理持久性,FIFO和其他功能,就像向订阅者传递消息一样。
顺便说一下,你永远不会“轮询”队列。相反,您始终订阅发布者。与观察者模式类似。一般来说,我会说天才原则。 所以它类似于邮箱或邮局,除了它在消息可用时向您发送通知。
答案 2 :(得分:0)
从文档here引用:
AMQP经纪人将消息传递给订阅的消费者 队列或使用者根据需要从队列中获取/拉取消息。
并且来自here:
将消息存储在队列中是没有用的,除非应用程序可以使用 他们。在AMQP 0-9-1模型中,应用程序有两种方法可以 做到这一点:
Have messages delivered to them ("push API") Fetch messages as needed ("pull API")
使用“推送API”时,应用程序必须表明对 消耗来自特定队列的消息。当他们这样做时,我们说 他们注册了一个消费者,或者简单地说,订阅了一个队列。它 每个队列可能有一个以上的消费者,或者注册一个 排他消费者(将所有其他消费者从队列中排除,而 这很消耗)。
每个消费者(订阅)都有一个称为消费者标签的标识符。 它可以用于退订消息。消费者标签只是 字符串。
答案 3 :(得分:-4)
RabbitMQ代理就像服务器一样,在没有消费者客户端将自己注册到服务器的情况下不会向消费者发送数据。但问题就像下面的问题
RabbitMQ可以保留客户端消费者详细信息并在数据包到达时连接到客户端吗?
答案是否定的。那么什么是替代,然后自己编写插件,在某种配置中维护客户端信息。插件将从RabbitMQ队列中拉出并推送到客户端。
请看看这个插件可能会有所帮助 https://www.rabbitmq.com/shovel.html
坦率地说,客户端需要实现AMQP协议才能接收,并且应该在某个端口上监听连接。这听起来像另一台服务器。
的问候,
维沙尔