RabbitMQ 3.6.0 有什么新特性
我们很高兴地宣布 RabbitMQ 3.6.0 现已上市。这是一个新版本的代理,其中包含许多 新功能。在我们继续之前,您可以在此处获取: /docs/download。
本次发布在代理功能、贡献者开发环境和安全性方面带来了许多改进。让我们来看看其中一些最显著的改进。
功能
RabbitMQ 3.6.0 包含不少新功能和改进,但从我的角度来看,最重要的功能是延迟队列 (lazy-queues)。免责声明:这篇博文的作者参与了这项功能的开发 ;-)
延迟队列
这种新型队列通过将传递给它们的所有消息直接发送到文件系统,并在消费者到达队列时才将消息加载到内存中来工作。为了优化磁盘读取,消息是分批加载的。
与旧方法相比,这种方法有几个优点。RabbitMQ 的默认队列会将消息缓存到内存中,以便快速交付给消费者。这个缓存的问题在于,如果消费者不够快,或者消费者完全离线,那么越来越多的消息将被保留在内存中,这将在某个时候触发将队列消息分页到磁盘的算法。尽管在之前的版本中我们已经 改进了分页算法,但分页仍然可能阻塞队列进程,这可能导致 信用流 启动,最终阻塞发布者。
使用延迟队列,没有分页,因为如上所述,所有消息都直接发送到磁盘。我们的测试表明,即使在消费者离线的情况下,这也能使队列的吞吐量更加均匀。
延迟队列的另一个优点是由于消除了上述消息缓存而导致的内存使用量减少。
最后,延迟队列可以在运行时启用和禁用。您可以使用 策略 将队列从默认队列转换为延迟队列,甚至在需要时将其改回默认模式。
要了解有关延迟队列的更多信息,请参阅其 文档。
更快的镜像队列同步
队列之间的同步得到了极大的改进。在 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 附带的所有新功能和错误修复: 发布说明。