目录
文章目录
不使用数据库作为 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
- 局部关闭返回任务结果&#