34

我有一个 python 应用程序,我想在后台开始做更多的工作,以便在它变得更忙时可以更好地扩展。在过去,我使用 Celery 来执行普通的后台任务,并且效果很好。

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

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

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

RabbitMQ: 支持持久队列和集群,但他们今天的集群方式的问题是,如果您丢失集群中的一个节点,那么该节点中的所有消息都将不可用,直到您将该节点重新联机。它不会在集群中的不同节点之间复制消息,它只是复制有关消息的元数据,然后它会返回原始节点获取消息,如果该节点没有运行,那么你就是 SOL 不是理想的。

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

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

问题:

  1. 设置 celery 以保证消息处理的最佳方法是什么。

  2. 有没有人这样做过?如果是这样,介意分享你的所作所为吗?

4

5 回答 5

5

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

于 2013-08-29T12:36:25.200 回答
3

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

于 2013-03-01T22:15:01.927 回答
1

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

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

于 2011-09-07T15:33:44.743 回答
0

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

于 2011-09-18T20:48:54.533 回答
0

我已将 Amazon SQS 用于此提议并获得了不错的结果。您将收到消息,直到您将其从队列中删除,并且它允许您将应用程序增长到您需要的最高级别。

于 2011-08-31T12:38:27.050 回答