分布式任务队列 Celery — 实践

本文介绍了在使用 Celery 分布式任务队列时的一系列实践策略,包括避免使用数据库作为 Broker,减少对任务结果的关注,实现任务优先级,动态扩展 Worker 并发池,应用任务预取数,保持任务幂等性,设置任务超时限制,善用任务工作流,合理使用 ack_late 机制,传递 ORM 对象唯一标识,预防内存泄漏,以及合理安排定时任务调度和启用任务监控。这些策略旨在提升系统性能和任务处理效率。
摘要由CSDN通过智能技术生成

目录

不使用数据库作为 Broker

Broker 的选择大致有消息队列和数据库两种,**这里建议尽量避免使用数据库作为 Broker,除非你的业务系统足够简单。**在并发量很高的复杂系统中,大量 Workers 访问数据库的行为会使得操作系统磁盘 I/O 一直处于高峰值状态,非常影响系统性能。如果数据库 Broker 同时还兼顾着后端业务的话,那么应用程序也很容易被拖垮。

反观选择消息队列,例如 RabbitMQ,就不存在以上的问题。首先 RabbitMQ 的队列存放到内存中,速度快且不占用磁盘 I/O。再一个就是 RabbitMQ 会主动将任务推送给 Worker,所以 Worker 无需频繁的去轮询队列,避免无谓的资源浪费。

不要过分关注任务结果

Task.delay/Task.apply_async 返回的 AsyncResult 对象用于关联任务的执行结果,前提是启用了 Result Backend。不过任务结果的传递同样需要成本,所以 Celery 默认会将其 Disabled。

  • 全局开启返回任务结果,默认为关闭:
app.conf.task_ignore_result = False
  • 局部关闭返回任务结果&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范桂飓

文章对您有帮助就请一键三连:)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值