我有一个 python 应用程序,我想在后台开始做更多的工作,以便在它变得更忙时可以更好地扩展。在过去,我使用 Celery 来执行普通的后台任务,并且效果很好。
这个应用程序与我过去所做的其他应用程序之间的唯一区别是我需要保证这些消息被处理,它们不会丢失。
对于这个应用程序,我不太关心消息队列的速度,我首先需要可靠性和持久性。为了安全起见,我希望有两台队列服务器,它们都位于不同的数据中心,以防万一出现问题,一个是另一个的备份。
看看 Celery,它看起来支持一堆不同的后端,其中一些具有比其他更多的功能。最流行的两个看起来像 redis 和 RabbitMQ,所以我花了一些时间进一步研究它们。
RabbitMQ: 支持持久队列和集群,但他们今天的集群方式的问题是,如果您丢失集群中的一个节点,那么该节点中的所有消息都将不可用,直到您将该节点重新联机。它不会在集群中的不同节点之间复制消息,它只是复制有关消息的元数据,然后它会返回原始节点获取消息,如果该节点没有运行,那么你就是 SOL 不是理想的。
他们建议解决此问题的方法是设置第二台服务器并使用 DRBD 复制文件系统,然后在需要时运行诸如起搏器之类的东西将客户端切换到备份服务器。这看起来很复杂,不确定是否有更好的方法。有人知道更好的方法吗?
Redis: 支持读取从属,这将允许我在紧急情况下进行备份,但它不支持主-主设置,我不确定它是否处理主从之间的主动故障转移。它没有与 RabbitMQ 相同的功能,但看起来更容易设置和维护。
问题:
设置 celery 以保证消息处理的最佳方法是什么。
有没有人这样做过?如果是这样,介意分享你的所作所为吗?