Django和Rabbitmq架构

时间:2018-03-17 00:49:50

标签: django rabbitmq celery django-celery

我想将RabbitMQ与Django一起用于消息队列。目前我正在使用每个Django应用服务器的RabbitMQ和芹菜的新实例。我想知道这是最好的方法吗?或者我应该有一个用于排队消息的RabbitMQ集群和多个芹菜来执行这些任务吗?

1 个答案:

答案 0 :(得分:0)

如果您对Web应用程序进行负载平衡,并且您的意图是在每台主机上运行多个芹菜工作者,那么您肯定希望所有工作人员使用相同的rabbitmq群集。我喜欢在我运行worker的节点上传播我的rabbitmq集群,并启用了队列持久性功能。但您可以选择单独的兔子群(取决于您的预算)。

如果您运行多个单独的应用程序,那么我会为该应用程序运行兔子localy。

- 编辑 -

在评论中,您提到您的应用是负载均衡的,并且您尝试群集兔子,并且多个工作人员执行相同任务时遇到问题。

我想到了一些事情,如果您可以发布celery.py/celeryconfig.py以及显示如何将任务插入队列的示例代码,那就太好了。

此时我可以就群集提出建议,因为这非常简单:

  • 选择主群集节点(即主机名rabbit1)
  • 在辅助群集节点上删除/ var / lib / rabbitmq / *的内容(不要删除文件夹本身!)
  • 在辅助群集节点上从主节点复制.erlang.cookie(它应该是在您第一次启动rabbitmq时创建的,通常可以在/var/lib/rabbitmq/.erlang.cookie下找到它);此文件必须在两个节点上保存完全相同的内容,并且必须由rabbitmq拥有:rabbitmq with group和其他节点被切断。
  • 确保/ etc / hosts在两个节点上都提及两个节点
  • 启动两个节点
  • 在辅助节点上运行以下命令(作为rabbitmq用户,这很重要,因为.erlang.cookie是基于每个用户创建的,很可能你的rabbitmq进程以rabbitmq用户身份运行):

(以下命令在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