Ruby AMQP Gem 有什么新动态?
在过去一年中,AMQP gem 的开发实际上处于停滞状态,因为其原始作者 Aman Gupta (@tmm1) 很忙。 许多错误仍未解决,代码变得陈旧过时,并且没有制作新的功能或文档。
在这一点上,我开始与 RabbitMQ 的人讨论在这方面进行合作的可能性。 实际上,最初当我看到 Ezra Zygmuntowicz 正在寻找加入他的云团队的人时,我联系了 VMware,但是当我发现 VMware 最近收购了位于伦敦的 RabbitMQ 项目时,我产生了兴趣。 我签署了合同,从 script/console
切换到 Wireshark 和 RabbitMQ Tracer,并且自 11 月以来,我一直在愉快地 hack 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 的垃圾收集器非常弱)MRI。 我很快将创建一些基准测试,以查看性能是否更好以及好多少。
AMQ-Protocol 仍在开发中。 它可以工作,但仍需要一些润色、重构和优化,以及文档和测试。
其他更改
我修复了很多错误,并将所有待处理的 pull request 合并到主存储库中。 一旦我发布 AMQP 0.7,我将写更多关于更改的内容。 我最近发布了 0.7.pre,您可以通过运行 gem install amqp --pre
来尝试它,这将非常感谢。 由于测试套件的工作仍在进行中,因此目前的发布过程有点像俄罗斯轮盘赌。
向后兼容性
我修复了很多错误,显然,修复后的代码永远不会与旧的错误代码向后兼容。 主要更改之一是 MQ#queues
(以及 MQ#fanouts
等)不再是哈希,而是一个类似数组的集合,具有类似哈希2 的行为。 当创建另一个匿名实例时,它不会覆盖匿名实例(就像以前那样),并且它支持服务器生成的名称。 因此,它现在只是将两个实例添加到集合中,而不是 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 上关注我!