celery路由和监控踩坑记录

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状态

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值