RabbitMQ 3.6.0 的新特性
我们很高兴地宣布 RabbitMQ 3.6.0 的正式发布,这是一个新版本的 Broker,其中包含大量新功能。 在我们继续之前,您可以在这里获取它:/docs/download。
此版本为 Broker 功能、我们贡献者的开发环境和安全性带来了许多改进。 让我们来看看其中一些最重要的改进。
功能
RabbitMQ 3.6.0 中有很多新功能和改进,但在我看来,最重要的是惰性队列。 免责声明:这篇博文的作者参与了此功能的开发 ;-)
惰性队列
这种新型队列的工作方式是将传递给它们的每条消息直接发送到文件系统,并且仅在消费者到达队列时才将消息加载到 RAM 中。 为了优化磁盘读取,消息以批处理方式加载。
与旧方法相比,这种方法有一些优势。 RabbitMQ 默认队列在内存中保留消息缓存,以便快速传递给消费者,此缓存的问题在于,如果消费者不够快,或者消费者完全离线,则越来越多的消息将保存在 RAM 中,这在某个时候会触发使队列将消息分页到磁盘的算法。 即使在之前的版本中,我们改进了分页算法,分页仍然会阻塞队列进程,这可能会导致信用流的介入,最终导致发布者被阻塞。
使用惰性队列,则无需分页,因为如上所述,所有消息都直接发送到磁盘。 我们的测试表明,即使在消费者离线的情况下,这也具有使队列吞吐量更加均匀的效果。
惰性队列的另一个优点是由于消除了上述消息缓存而减少了 RAM 使用量。
最后,惰性队列可以在运行时启用和禁用。 您可以使用策略将队列从默认队列转换为惰性队列,如果您觉得需要,甚至可以转换回默认模式。
要了解有关惰性队列的更多信息,请参阅其文档。
更快的镜像队列同步
队列之间的同步已大大改进。 在 RabbitMQ 3.6.0 之前,同步算法会尝试一次向那些不同步的镜像发送一条消息。 通过在 RabbitMQ 队列内部实现批量发布操作,此算法得到了改进。
在开发过程中,我们的测试表明,对于包含一百万条消息的队列,旧算法完成完全同步大约需要 60 秒,而新算法对于相同数量的消息大约需要 10 秒。
在此处阅读有关镜像队列同步的更多信息here。
迁移到 Git
在今年的大部分时间里,我们的开发完全从我们自托管的 Mercurial 存储库迁移到了托管在 Github 上的基于 Git 的工作流程。 这极大地提高了我们团队自身的生产力,使我们更容易开发新功能并在同事之间获得反馈。
不过,更好的是,现在 RabbitMQ 用户可以更轻松地将他们的贡献反馈给我们。
此版本附带了六位不同外部贡献者直接发送给 Broker 的许多改进。 当然,我们希望提高这个数字。
迁移到 Github 也意味着我们现在拥有公共 Bug 跟踪器。 请在此处提交问题:https://github.com/rabbitmq/rabbitmq-server/issues。 这是我们关于如何使用 Git 和 Github 的指南。
迁移到 Erlang.mk
RabbitMQ 作为一个项目,早于 Erlang 生态系统中流行的构建工具,如 Rebar 或 Erlang.mk,因此我们有自己的构建 Broker 和管理 Erlang 依赖项的方式。 这很不幸,因为它使得将外部库与 RabbitMQ 集成有点困难,同时,它也使其他 Erlang 用户使用 RabbitMQ 库变得复杂。 看看这个 Github 搜索,人们正在尝试不同的方法将我们自己的 gen_server2
集成到他们的项目中:gen_server2 搜索
为了改善这方面的情况,我们的一位同事努力彻底改造了我们的构建系统。 我们保留了 make
,这是一个经过测试的工具,但我们迁移到了 Erlang.mk,一个基于 make 的 Erlang 世界构建系统。
这改进了我们处理依赖项的方式,使我们能够删除大量重复 Erlang.mk 已提供的功能的代码,甚至缩短了构建时间!
更改我们构建系统上的内容意味着在构建 RabbitMQ 插件的方式上引入了重大更改。 如果您是插件作者,您可能需要阅读我们新的插件开发指南。
安全性
最后但并非最不重要的一点,让我们谈谈安全性的改进,特别是关于 RabbitMQ 中密码的处理方式。 在 3.6.0 版本之前,密码在 RabbitMQ 中以 md5 哈希形式存储,这在今天这个时代来说不太理想。 现在我们将 SHA-256
设置为默认密码哈希函数,SHA-512
是我们开箱即用的选项。
在这方面,还可以通过插件向 RabbitMQ 添加其他哈希算法。 要添加新的哈希算法,您只需要实现此 Erlang 行为rabbit_password_hashing.erl,它仅公开一个函数:hash/1
。
如果您创建了新的密码哈希插件,请不要忘记在我们的邮件列表中宣布它:rabbitmq-users。
结论
您可以想象,我们对这个新的 RabbitMQ 版本感到非常高兴,它为我们继续改进 RabbitMQ 奠定了基础,而且现在通过拥有像 Erlang.mk 这样的标准工具和像 Github 这样的协作平台,我们与社区的联系更加紧密。
不要忘记查看我们的完整发行说明,了解 RabbitMQ 3.6.0 附带的所有新功能和错误修复:发行说明。