跳至主要内容

Ruby AMQP Gem 的现状

·阅读时长:5 分钟
Jakub Stastny

在过去的一年里,AMQP gem 的开发几乎停滞不前,因为它的原始作者 Aman Gupta (@tmm1) 很忙。许多 bug 依然没有得到解决,代码变得过时和落后,而且没有新的功能或文档发布。

此时,我开始与 RabbitMQ 的团队讨论可能进行的合作。实际上,最初我联系了 VMware,因为我看到 Ezra Zygmuntowicz 在寻找云团队的人员,但当我知道 VMware 最近收购了伦敦的 RabbitMQ 项目时,我产生了兴趣。我签署了协议,从 script/console 切换到 Wireshark 和 RabbitMQ Tracer,从 11 月起,我一直在愉快地开发 AMQP 和 AMQ-Protocol gem。

自我介绍一下,我的名字是 Jakub Stastny (@botanicus),我是一名 Ruby 独立开发者。我为 RubyGems、Merb 和 rSpec 等项目做出了贡献,我还编写了自己的框架,名为 Rango,这是唯一支持模板继承的 Ruby 框架。我也使用 Node.js,并且创建了 Minitest.js,用于测试异步代码的 BDD 框架。我的其他爱好包括 摄影 和旅行。

我询问 Aman 是否可以接管 AMQP gem 的维护工作,他很乐意这样做。此时,另外两位开发者 Michael Klishin (michaelklishin) 和 Ar Vicco (arvicco) 对开发工作表现出了兴趣,因此我们在 GitHub 上创建了 ruby-amqp 组织 并将原始代码及其相关的几个仓库 fork 到该组织下。GitHub 的团队很高兴将我们的仓库设置为主要仓库,而不是简单的 fork,因此从现在开始,所有内容都将在该仓库中维护(除了仍然在 tmm1 的 fork 中的问题,我们希望尽快解决和关闭这些问题)。

那么,有什么新内容呢?

测试套件

在初期,几乎没有任何测试,因此基本上不可能判断我所做的更改是否会破坏某些功能。所以我开始编写一些测试。在后期,当 michaelklishin 和 arvicco 加入开发工作后,我们将少数原始的 Bacon 规范重写为 rSpec 2,现在 arvicco 正在将 他之前编写的规范 移植到主要仓库。Arvicco 还编写了 amqp-spec,它是 em-spec 的超集,用于测试 AMQP gem。

AMQP 0.9.1

目前,该 gem 仅支持 AMQP 0.8,这是一个超过 2 年的旧版本,因此可能即将发布的最重要的功能是对 AMQP 0.9.1 的支持。因为这对其他客户端来说也是一项有益的功能,所以我决定创建一个名为 AMQ-protocol 的新库。它与 rabbitmq-codegen 类似,许多其他客户端库也使用该工具。

该 gem 的主要目标之一是速度非常快并且内存效率很高(不是为了追求内存效率本身,而是因为 MRI1 的垃圾收集器比较弱)。我将很快进行一些基准测试,以查看性能是否有所提升以及提升了多少。

AMQ-Protocol 仍处于开发阶段。它已经可以正常工作,但仍需要一些改进、重构和优化,以及文档和测试。

其他更改

我修复了许多 bug 并将所有待处理的 pull request 合并到主要仓库。我将在发布 AMQP 0.7 后详细介绍这些更改。我最近发布了 0.7.pre,你可以通过运行 gem install amqp --pre 来试用它,这将不胜感激。由于测试套件的工作仍在进行中,所以目前发布过程有点像俄罗斯轮盘赌。

向后兼容性

我修复了一些 bug,显然修复后的代码与之前的错误代码不向后兼容。主要更改之一是 MQ#queues(以及 MQ#fanouts 等)不再是一个哈希表,而是一个具有哈希表2 行为的类数组集合。它不会覆盖创建另一个匿名实例时的匿名实例(之前会这样做),并且支持服务器生成的名称。因此,不再是 MQ#queues[nil] = <第一个实例>,然后是 MQ#queues[nil] = <第二个实例>,而是将这两个实例都添加到集合中,当从服务器接收到 Queue.Declare-Ok 时,它会将名称更新为该名称。

未来计划

AMQP gem 非常有主见。如果你不想使用 EventMachine,你就会很惨。你可能想使用更底层的库,比如 IO.select,或者只是其他异步库,比如 cool.io。你甚至可能根本不想关心异步代码。

如果我们能有一个真正没有主见的 AMQP 客户端库就好了,这个库的任务只是公开 AMQP 协议定义的底层 API,而不进行任何抽象,比如隐藏通道等等。这样的库更适合其他库的实现者,而不是最终用户。AMQP 是一种复杂的协议,由于一些设计决策,为它设计一个良好且易于使用(有主见)的客户端库非常困难。因此,一些不作任何假设的基本库将有助于其他人进行尝试,并尝试在此库的基础上实现自己的有主见的库,而无需手动实现编码/解码或基本的套接字通信等难题。

有疑问吗?有想法吗?联系我们!

你对 AMQP gem 的开发感兴趣吗?你想参与进来吗?或者你有一些问题?随时与我联系,可以通过这篇博客文章下面的评论,或者给我发送电子邮件到 stastny@101ideas.cz,或者加入 Jabber MUC3 房间 amqp-dev@conf.netlab.cz,那里通常有所有当前维护者。为了获取所有新闻,请确保你在 Twitter 上关注我!

脚注

  1. Matz Ruby 实现,是最原始且使用最广泛的 Ruby 实现

  2. 或者说“哈希式”吗?

  3. 多人聊天

© 2024 RabbitMQ. All rights reserved.