导出 Excel 的任务平均跑 38 分钟,4 个 worker 里只要有两个在导出,普通任务就要等 20 分钟以上,P99 从 1.2 秒跳到 900 秒。乍看像缓存或者权限的锅,追下去往往不是。
celery -A app worker -Q long -c 2 --prefetch-multiplier=1 -n long@%h celery -A app worker -Q default -c 8 -n default@%h
追下去是这么回事:worker 默认预取 4 条消息,长任务被取走后同一批里的短任务只能排队等它跑完。长短任务共用一个队列,谁先被取到完全看投递顺序。
「长任务独占 worker」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
具体做法是,按耗时拆成 default 和 long 两个队列 各自起独立 worker;长任务 worker 的 prefetch 设为 1 避免一次抓走多条;长任务单独配并发 别和短任务抢进程;看两个队列的等待时间 确认短任务不再被拖住。
验收就看一点,导出任务跑起来时 普通任务 P99 仍在 1.5 秒内 长期队列的等待时间单独可查。
