celery使用以及中遇到的一些坑
任务路由
关于手动路由的配置
task_queues
手动配置任务队列,不需要在启动项中指定-Q
任务队列
task_queues = (
Queue('b_task', exchange=Exchange('b_task'), routing_key='b_task'),
Queue('l_task', exchange=Exchange('l_task'), routing_key='l_task'),
Queue('w_task', exchange=Exchange('w_task'), routing_key='w_task'),
Queue('default', default_exchange, routing_key='default'),
)
此处需要配置default队列,或者在启动的时候添加 - Q default。否则没有注册的任务会无法执行
task_default_queue = 'default'
default_exchange = Exchange('default', type='direct')
task_default_exchange = 'default'
task_default_exchange_type = 'topic'
task_default_routing_key = 'default'
task_routes
手动配置任务路由
任务路由
task_routes = {
'tasks.b': {'queue': 'b_task', 'routing_key': 'b_task'},
'tasks.l': {'queue': 'l_task', 'routing_key': 'l_task'},
'tasks.w': {'queue': 'w_task', 'routing_key': 'w_task'}
}
定时任务配置
启动命令中增加 -B 和单独启动定时任务命令效果一样
关于任务幂等的一些参数配置
worker_deduplicate_successful_tasks
默认值为关闭,开启后避免同一个任务被重复消费
task_acks_late
可结合使用,然后在程序中再进行控制,基本可以满足幂等需求
此项配置会在worker异常重启后,继续执行之前没有执行完的任务 task_reject_on_worker_lost = True
配合 task_acks_late
使用,需要结合使用场景决定是否启用,如果队列失败任务堆积过多,重启后可能会造成数据混乱,任务假死
关于并发模式遇到的问题
支持的并发模式有
prefork 进程池
gevent(基于cpython实现)、eventlet(纯python编写) 协程
实际使用中,当任务内本身有多线程或者线程池的操作时,如果使用协程的并发模式,任务无法正常下发,需要切换到prefork模式
关于队列任务监控
task_track_started
如果要查看任务是否开启,要开启此项配置,才会有started状态,否则通过任务状态返回的是pending状态