上一篇讲了用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