在工作中,我们需要构建一个任务服务器来完成像发送电子邮件、生成PDF文件、处理数据等任务。显然,我们希望基于某种通用的队列系统进行构建。我熟悉Gearman,并且它正是试图解决的这个问题:将作业放入队列中,让工作者来提取它们。然而,我看到了很多关于Rabbitmq的提及,不清楚它在这种情况下是如何使用的。
Rabbitmq是否是构建分布式任务系统的好框架?
在工作中,我们需要构建一个任务服务器来完成像发送电子邮件、生成PDF文件、处理数据等任务。显然,我们希望基于某种通用的队列系统进行构建。我熟悉Gearman,并且它正是试图解决的这个问题:将作业放入队列中,让工作者来提取它们。然而,我看到了很多关于Rabbitmq的提及,不清楚它在这种情况下是如何使用的。
Rabbitmq是否是构建分布式任务系统的好框架?
我认为Gearman更适用于队列化"作业",而RabbitMQ更适用于队列化"数据"。当然,它们实际上是同一种东西,但对我来说,如果你要将工作“分散”到独立的工作程序中并让它们独立工作,那么Gearman是更好的选择。但是,如果你想从许多来源中提取数据并将其传输给少量的数据消费者,则RabbitMQ是更好的解决方案。
RabbitMQ的历史说明了它擅长解决哪些问题。例如,Twitter使用RabbitMQ处理突发消息负载,并将其发送到老旧的SMS网关,这些网关只能保持一个连接处于打开状态,受到速率限制,并且无法重新尝试连接。
一切取决于您想要公开的语义。在RabbitMQ之上执行Gearman所做的事情非常容易,它可以将消息“扇出”到独立的工作者。
但是Gearman是为特定目的而构建的。如果我理解正确,Gearman是一个处理作业的框架,而不是像这样的消息系统。还有其他类似的框架,例如Celery,在底层使用RabbitMQ实现。这里有一篇关于Celery的文章值得一读。