RabbitMQ 3.0 的新功能是什么?
我们已经讨论过 RabbitMQ 3.0 如何破坏某些功能,但这并不是很积极。让我们来看看一些新功能!只是一些——3.0 中发生了很多变化,我们没有一整天的时间……
我们已经讨论过 RabbitMQ 3.0 如何破坏某些功能,但这并不是很积极。让我们来看看一些新功能!只是一些——3.0 中发生了很多变化,我们没有一整天的时间……
RabbitMQ 包含许多很酷的新功能。但为了实现其中一些功能,我们需要更改某些内容。因此,在这篇博文中,我将列出其中的一些内容,以防您需要对此做任何处理。
我为 RabbitMQ 编写了一个插件,该插件增加了对 MQTT 3.1 协议的支持。MQ Telemetry Transport 是一种轻量级发布/订阅协议,专为资源受限的设备和带宽受限的情况而设计,使其非常适合传感器和移动设备。该实现是一个协议适配器插件,允许 MQTT 客户端同时连接到 RabbitMQ 代理以及实现其他协议的客户端。我们鼓励需要在可靠、可扩展的代理中结合低开销协议以及高可靠性和企业功能的项目考虑此选项。
有一段时间,在 RabbitMQ 总部,我们一直在努力寻找一种在 Web 浏览器中公开消息传递的好方法。过去,我们尝试过许多方法,从久负盛名的 JsonRPC 插件(基本上通过 AJAX 公开 AMQP)到 Rabbit-Socks(尝试创建通用协议集线器)再到管理插件(可用于发送和接收来自浏览器的基本消息)。
随着时间的推移,我们了解到 Web 上的消息传递与我们习惯的非常不同。我们的尝试都没有真正解决这个问题,并且 Web 上的消息传递可能在一段时间内都不会成为一个完全解决的问题。
也就是说,RabbitMQ 用户不断询问一件简单的事情,尽管它并不完美,但它远非在浏览器中进行消息传递的最糟糕方式:通过 Websockets 公开 STOMP。
您在 Rabbit 中有一个队列。您有一些客户端从该队列中消费。如果您根本不设置 QoS 设置(basic.qos
),那么 Rabbit 会尽快将所有队列消息推送到客户端,网络和客户端允许的范围内。消费者将在内存中膨胀,因为它们会将其自己的 RAM 中的所有消息缓冲。如果您询问 Rabbit,队列可能看起来为空,但可能有数百万条未确认的消息,因为它们驻留在客户端中,准备由客户端应用程序进行处理。如果您添加新的消费者,则队列中不再有消息发送给新消费者。消息只是在现有客户端中缓冲,并且可能存在很长时间,即使有其他消费者可以更快地处理此类消息。这相当不理想。
因此,默认的 QoS prefetch
设置为客户端提供了无限缓冲区,这可能导致不良的行为和性能。但是,您应该将 QoS prefetch
缓冲区大小设置为多少?目标是让消费者工作饱和,但要最大程度地减少客户端的缓冲区大小,以便更多消息保留在 Rabbit 的队列中,因此可以提供给新的消费者或在它们空闲时发送给消费者。
自从新的持久化程序出现在 RabbitMQ 2.0.0 中(是的,它现在已经不那么新了)以来,Rabbit 在处理不断增长、增长、增长并达到无法在 RAM 中容纳的大小队列方面一直有一个相对不错的解决方案。Rabbit 很早就开始将消息写入磁盘,并以缓慢的速度继续这样做,因此当 RAM 变得非常紧张时,我们已经完成了大部分艰苦的工作,从而避免了突然的写入高峰。如果您的消息速率不太高或不太突发,则所有这些都应该在不会对任何连接的客户端造成任何实际影响的情况下发生。
最近与客户的讨论使我们重新审视了我们认为已经解决的问题,并促使我们进行了一些更改。