我想将RabbitMQ与Django一起用于消息队列。目前我正在使用每个Django应用服务器的RabbitMQ和芹菜的新实例。我想知道这是最好的方法吗?或者我应该有一个用于排队消息的RabbitMQ集群和多个芹菜来执行这些任务吗?
答案 0 :(得分:0)
如果您对Web应用程序进行负载平衡,并且您的意图是在每台主机上运行多个芹菜工作者,那么您肯定希望所有工作人员使用相同的rabbitmq群集。我喜欢在我运行worker的节点上传播我的rabbitmq集群,并启用了队列持久性功能。但您可以选择单独的兔子群(取决于您的预算)。
如果您运行多个单独的应用程序,那么我会为该应用程序运行兔子localy。
- 编辑 -
在评论中,您提到您的应用是负载均衡的,并且您尝试群集兔子,并且多个工作人员执行相同任务时遇到问题。
我想到了一些事情,如果您可以发布celery.py/celeryconfig.py以及显示如何将任务插入队列的示例代码,那就太好了。
此时我可以就群集提出建议,因为这非常简单:
(以下命令在rabbit2上运行)
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app
rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
注意 - 最后一个命令是使队列在节点之间保持不变,因此当一个节点死亡时,您的群集将继续工作而不会丢失任务。
您可以使用以下命令检查群集是否正常工作:
rabbitmqctl cluster_status
我建议您是否可以停止所有工作人员并将一个任务插入队列,然后运行此命令以查看队列中是否只有一个任务:
rabbitmqctl list_queues -p your_vhost_name
队列中应该只有一个任务。
然后你可以查看你正在使用的交换。根据你的评论,我猜你可能正在使用扇出交换。我没有太深入交流,但您可以通过运行此命令来检查您的交换:
rabbitmqctl list_exchanges -p your_vhost_name
或分析以下内容:
rabbitmqctl report