Rabbitmq或Gearman - 如何选择任务队列

72

在工作中,我们需要构建一个任务服务器来完成像发送电子邮件、生成PDF文件、处理数据等任务。显然,我们希望基于某种通用的队列系统进行构建。我熟悉Gearman,并且它正是试图解决的这个问题:将作业放入队列中,让工作者来提取它们。然而,我看到了很多关于Rabbitmq的提及,不清楚它在这种情况下是如何使用的。

Rabbitmq是否是构建分布式任务系统的好框架?


4
作为对此的后续,我最终选择了RabbitMQ和优秀的Carrot/Celery软件包,并对我的选择感到非常满意。Celery非常惊人且在你弄清楚如何配置系统之后非常简单。AMQP一开始可能有点令人费解,但是Celery很好地抽象出许多复杂性,直到你准备深入研究为止。 - brianz
1
@alexis,PDF处理的链接已经失效了。请问你能否修复一下呢? - ihsan
1
Sean Crubbs的网页上似乎有一篇文章转载 - Uwe Mesecke
2个回答

72

我认为Gearman更适用于队列化"作业",而RabbitMQ更适用于队列化"数据"。当然,它们实际上是同一种东西,但对我来说,如果你要将工作“分散”到独立的工作程序中并让它们独立工作,那么Gearman是更好的选择。但是,如果你想从许多来源中提取数据并将其传输给少量的数据消费者,则RabbitMQ是更好的解决方案。

RabbitMQ的历史说明了它擅长解决哪些问题。例如,Twitter使用RabbitMQ处理突发消息负载,并将其发送到老旧的SMS网关,这些网关只能保持一个连接处于打开状态,受到速率限制,并且无法重新尝试连接。


32

一切取决于您想要公开的语义。在RabbitMQ之上执行Gearman所做的事情非常容易,它可以将消息“扇出”到独立的工作者。

但是Gearman是为特定目的而构建的。如果我理解正确,Gearman是一个处理作业的框架,而不是像这样的消息系统。还有其他类似的框架,例如Celery,在底层使用RabbitMQ实现。这里有一篇关于Celery的文章值得一读。


8
我们不仅使用 Celery,它实际上将整个 Django 框架作为依赖项。在我的经验中,感觉作者是专门为自己的环境编写的,以满足他特定的需求。这并不一定是坏事,但与 Gearman 或 RabbitMQ 本身相比,它并不公平。Gearman 和 RabbitMQ 都非常灵活。 - jamieb
17
记恨着别人? :) Celery 不仅适用于 Python,还可以通过 HTTP 工作。在我看来,这比 Gearman 用于支持多种语言的模式要好得多(使用想要支持的语言实现 workers)。实际上,其他语言也很容易实现 celery workers,因为 celery 实际上是一种消息协议,其中 celeryd 只是它的 Python 实现。我不知道你从哪里得到的 Celery 与 Gearman 不可比较的想法,但你应该阅读 FAQ(特别是 http://bit.ly/cSh6Ys 和 http://bit.ly/cANwUg),并提供一些新的论据。 - asksol
1
如果真的是关于更好的模型,我们都会使用Gopher而不是HTTP :) - Abhishek Dujari
1
提供的链接现在已经无法访问,您能否更新一下? - Relequestual
在这里找到了链接的存档 https://web.archive.org/web/20100421082319/http://webcookies.org/blog/2009/09/10/rabbitmq-celery-and-django/ - Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接