如何保证Celery的邮件传递?

时间:2011-07-05 01:14:56

标签: message-queue redis rabbitmq celery high-availability

我有一个python应用程序,我想在后台开始做更多的工作,这样它会变得更加繁忙,因为它变得更加繁忙。在过去,我使用Celery来完成正常的后台任务,这一点运作良好。

此应用程序与我过去所做的其他应用程序之间的唯一区别是,我需要保证这些消息得到处理,不会丢失。

对于这个应用程序,我不太关心我的消息队列的速度,我首先需要可靠性和耐用性以及formost。为了安全起见,我希望有两个队列服务器,两个都在不同的数据中心,以防出现问题,一个是另一个的备份。

看看Celery看起来它支持一堆不同的后端,有些后端具有更多功能。两个最流行的看起来像redis和RabbitMQ所以我花了一些时间来进一步研究它们。

RabbitMQ的: 支持持久队列和群集,但是它们今天的群集方式存在的问题是,如果丢失群集中的节点,则该节点中的所有消息都将不可用,直到您将该节点重新联机为止。它不会复制群集中不同节点之间的消息,只是复制有关消息的元数据,然后返回到原始节点以获取消息,如果节点未运行,则为S.O.L.不理想。

他们建议解决这个问题的方法是设置第二台服务器并使用DRBD复制文件系统,然后运行pacemaker之类的东西,以便在需要时将客户端切换到备份服务器。这似乎很复杂,不确定是否有更好的方法。有人知道更好的方法吗?

Redis的: 支持读取从站,这将允许我在紧急情况下备份,但它不支持主 - 主设置,我不确定它是否处理主站和从站之间的主动故障转移。它与RabbitMQ没有相同的功能,但看起来更容易设置和维护。

问题:

  1. 设置芹菜的最佳方法是什么? 这样它就能保证信息 处理

  2. 以前有人这样做过吗?如果是这样, 会分享你的所作所为吗?

5 个答案:

答案 0 :(得分:5)

OP以来发生了很多变化!现在有一个高可用性选项,也就是“镜像”队列。这对解决您描述的问题非常重要。请参阅http://www.rabbitmq.com/ha.html

答案 1 :(得分:3)

您可能需要查看IronMQ,它涵盖您的要求(持久,高可用性等),并且是云原生解决方案,因此无需维护。还有一个Celery代理商:https://github.com/iron-io/iron_celery所以你只需更改你的Celery配置即可开始使用它。

答案 2 :(得分:1)

我怀疑Celery绑定到现有的后端是您所需的可靠性保证的错误解决方案。

鉴于您希望分布式排队系统具有强大的持久性和可靠性保证,我首先要寻找这样一个系统(它们确实存在),然后找出在Python中绑定它的最佳方法。这可能是通过Celery&是否有新的后端。

答案 3 :(得分:0)

我已经将Amazon SQS用于此提议并取得了良好的效果。您将收到消息,直到您将其从队列中删除,并且它允许您根据需要增加应用程序。

答案 4 :(得分:0)

使用分布式渲染系统是一种选择吗?通常保留给HPC但很多概念是相同的。查看Qube或截止日期渲染。还有其他开源解决方案。鉴于某些渲染的高度复杂性和失败风险,每个图像序列帧可能需要数小时才会出现故障转移。