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