celery中间件:broker
Celery 支持多种消息传输的方式。
中间人(Broker)使用指南
-
使用 RabbitMQ
-
使用 Redis
-
使用 Amazon SQS
中间人(Broker)概况
这是不同的中间件比对情况,更多的信息可以在每个中间件的文档中找到。
名称 |
状态 |
监控 |
远程控制 |
RabbitMQ |
稳定 |
是 |
是 |
Redis |
稳定 |
是 |
是 |
Amazon SQS |
稳定 |
否 |
否 |
Zookeeper |
实验阶段 |
否 |
否 |
目前实验阶段的中间人(Broker)只是功能性的,但是没有专门的维护人员。
缺少监控就意味着这个监控已经失效,因此相关的 Flower、Celery events、celerymon 和其他基于此功能的监控工具全部失效。
远程管理控制是指可以通过 celery inspect 和 celery control(以及使用远程控制API的工具)在程序运行时检查和管理职程(Worker)的能力。
使用RabbitMQ
安装与配置
RabbitMQ 是默认的中间人(Broker),只需要配置连接的URL即可,不需要安装额外的的配置以及初始化配置信息
broker_url = 'amqp://myuser:mypassword@localhost:5672/myvhost'
有关 Celery 各种中间人(Broker)的配置列表,请查阅代理设置,并且按照说明设置用户名和密码。
安装 RabbitMQ服务
安装 RabbitMQ 服务可以通过 RabbitMQ官网 进行 安装RabbitMQ ,Mac OS安装请查阅 Mac OS安装RabbitMQ。
配置 RabbitMQ
要使用 Celery,需要创一个RabbitMQ账户:
sudo rabbitmqctl add_user myuser mypassword
sudo rabbitmqctl add_vhost myvhost
sudo rabbitmqctl set_user_tags myuser mytag
sudo rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*"
修改myuser、mypassword、myvhost为自己配置的配置信息。
关于更多RabbitMQ配置,请查阅 RabbitMQ手册。
Rabbit MQ安装过程:
略......
使用Redis
安装
如果使用 Redis 作为中间人(Broker)必须要安装 Celery 的依赖库,您可以通过 celery[redis] 进行安装:
pip install -U "celery[redis]"
配置
Redis 的配置非常的简单,只需要配置 Redis 的 URL :
app.conf.broker_url = 'redis://localhost:6379/0'
URL 的格式为:
redis://:password@hostname:port/db_number
URL 的所有配置都可以自定义配置的,默认使用的是 localhost 的 6379 端口中 0 数据库。( Redis 默认有 16 个数据库)
可以通过 Uninx 套接字进行连接,URl 格式如下:
redis+socket:///path/to/redis.sock
可以通过设置 virtual_host参数添加到URL上进行指定使用时 Uninx 套接字连接的数据库编号:
redis+socket:///path/to/redis.sock?virtual_host=db_number
Celery 也可以连接 Redis 哨兵也是非常简单的:
app.conf.broker_url = 'sentinel://localhost:26379;sentinel://localhost:26380;sentinel://localhost:26381'
app.conf.broker_transport_options = {'master_name':'cluster1'}
可见性超时
可见性超时为将消息重新下发给另外一个程序之前等待确认的任务秒数。请注意查看下面的 注意事项。
可以通过 broker_transport_options
选项进行修改:
app.conf.broker_transport_options = {'visibility_timeout': 3600} # 一个小时
默认的可见性超时时间为1个小时。
结果
如果您想保存任务执行返回结果保存到Redis,您需要进行以下配置:
app.conf.result_backend = 'redis://localhost:7379/0'
有关 Redis 保存结果的完整选项列表,请查阅 Redis后端配置。
如果您使用的是 Redis 哨兵默认是,则需要使用 result_backend_transport_options
进行指定 master_name:
app.conf.result_backend_transport_options = {'master_name': "mymaster"}
注意事项
广播前缀
默认情况下,所有的虚拟机都可以看到广播的消息。
您必须为消息进行设置前缀,以便它们由仅活动的虚拟机接收:
app.conf.broker_transport_options = {'fanout_prefix': true}
注意:该选项仅是向后兼容的,老版本不支持。集群中所有的职程都必须要开启设置,否则无法进行通信。
该设置在将来以后的版本是默认配置,所以请尽早进行迁移。
广播模式
默认情况下, 职程(Worker)收到所有与任务相关的事件。
为了避免该情况发生,需要进行配置 fanout_patterns
广播模式,以便职程(Worker)只能订阅相关的事件:
app.conf.broker_transport_options = {'fanout_patterns': true}
该设置在将来以后的版本是默认配置。
可见性超时
如果在“可见性超时“内没有完成任务,该任务会重新分配给另外一个职程(Worker)进行执行。
这可能会出现在预计时间超出可见性超时时间的问题,如果出现该问题,任务将重新循环执行。
因此您必须要增加可见性超时时间用于用于匹配最长的执行时间。
注意:Celery会在职程(Worker)关闭的重新分配消息,如果可见性超时时间过长在断电或者强制终止职程(Worker)的情况会“丢失“重新分配的任务。
定期执行任务不会被可见性超时影响,因为这是俩个不同的概念。
您可以通过配置同名的配置选项来扩增可见性超时时间:
app.conf.broker_transport_options = {'visibility_timeout': 432000}
对应的值必须为 int 类型。
驱逐Key
在某些情况下,Redis会根据(驱逐策略)进行驱逐一些key
可能会出现已经错误问题:
InconsistencyError: Probably the key ('_kombu.binding.celery') has been
removed from the Redis database.
您可以在Redis服务器的 time_out 参数设置为0进行避免key被驱逐。
使用Amazon SQS
略......