跳至主内容

Ruby AMQP Gem 现状如何?

·6 分钟阅读
Jakub Stastny

在过去一年里,AMQP gem 的开发几乎停滞不前,因为它的最初作者 Aman Gupta@tmm1)非常忙碌。许多 bug 未得到解决,代码变得陈旧过时,也没有添加新功能或文档。

这时,我开始与 RabbitMQ 的人讨论合作的可能性。事实上,最初我联系 VMware 是因为看到 Ezra Zygmuntowicz 在为他的云团队招人,但当我发现 VMware 最近收购了伦敦的 RabbitMQ 项目时,我产生了兴趣。我签署了合同,从 script/console 切换到 Wireshark 和 RabbitMQ Tracer,从 11 月份开始,我一直在愉快地开发 AMQP 和 AMQ-Protocol gems。

自我介绍一下,我叫 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,所以从现在开始,所有内容都将在那里(除了我们希望尽快解决和关闭的 issues,它们仍然在 tmm1 的 fork 中)。

那么,有什么新变化?

测试套件

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

AMQP 0.9.1

目前该 gem 只支持 AMQP 0.8,这是一个两年多前的版本,所以最重要的即将推出的功能很可能是支持 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,显然修复后的代码与旧的 buggy 代码不向后兼容。一个主要的改变是 MQ#queues(以及 MQ#fanouts 等)不再是 hash,而是一个类似数组的集合,具有类似 hash2 的行为。它不会覆盖匿名实例(像以前那样)当另一个匿名实例被创建时,并且它支持服务器生成的名称。因此,代替 MQ#queues[nil] = <first instance> 然后 MQ#queues[nil] = <second instance>),它现在只是将两个实例添加到集合中,当它从服务器接收到 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 Implementation,原始且最广泛使用的 Ruby 实现

  2. 还是形容词是 hash-ish?

  3. Multi user chat

© . This site is unofficial and not affiliated with VMware.