安装RabbitMQ作Celery的broker

上一篇讲了用redis作Celery的broker,会导致执行长延迟的ETA定时任务时,超过visibility_timeout设置后任务被重复执行的bug。由于没有比较好的解决办法,只好换用RabbitMQ。

在Ubuntu上安装RabbitMQ非常简单,直接从源安装就好:

sudo apt-get install rabbitmq-server

为了能在celery中用rabbitmq,需要设置用户密码和virtual host:

sudo rabbitmqctl add_user myuser mypassword
sudo rabbitmqctl add_vhost myvhost
sudo rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*"

上面设置了用户名:myuser,密码:mypassword,virtual_host:myvhost
于是,按照celery的broker url规则:

transport://userid:password@hostname:port/virtual_host
设置celeryconfig.py中写:
BROKER_URL = 'amqp://myuser:mypassword@localhost:5672/myvhost'

最后重启rabbitmq server:

sudo service rabbitmq-server

安装rabbitmq管理工具:

sudo rabbitmq-plugins enable rabbitmq_management
sudo service rabbitmq-server restart

这时候,打开 http://server-name:55672/ 就可以进入管理界面了。通过 http://server-name:55672/cli 下载rabbitmqadmin命令行工具。

rabbitmq会启动 beam.smp 进程,占用两三个端口:

tcp        0      0 0.0.0.0:56908           0.0.0.0:*               LISTEN      21072/beam.smp
tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN      21072/beam.smp
tcp        0      0 0.0.0.0:55672           0.0.0.0:*               LISTEN      21072/beam.smp
tcp6       0      0 :::5672                 :::*                    LISTEN      21072/beam.smp

另外还有 erlang 进程:

rabbitmq  6228     1  0 Jan02 ?        00:00:00 /usr/lib/erlang/erts-5.9.1/bin/epmd -daemon

经测试,位于 rabbitmq中的定时任务,在重启 rabbitmq后依然存在。

不过,重启rabbitmq后,celery已经失去broker连接,所有celery进程都没有了,supervisor的状态为 not running,需要手动再重启一下celery才行。

rabbitmq的命令行管理 工具文档,https://www.rabbitmq.com/man/rabbitmqctl.1.man.html

rabbitmq支持分步式部署,高可用:http://www.rabbitmq.com/clustering.html, http://symphony.b3log.org/article/1380179992896