我正在运行一些长任务,我需要确保排队的任务按接收顺序执行。我在第一次测试中发现,当我达到最大 worker 数 (CELERYD_CONCURRENCY) 时,发送的以下任务将排队,然后执行的第一个任务实际上是最新的任务。
当然,相反的行为是我所追求的,当有空闲 worker 时,最旧的消息是最先执行的。
这种行为的解释是什么,如何改变?
最佳答案
结果证明这是 Rabbitmq 设置 prefetchCount 的结果,它为每个 channel 预取一组消息。
由于我将队列用于长时间运行的任务,因此通过设置 CELERYD_PREFETCH_MULTIPLIER 解决了该问题。到 1,默认为 4,这样只会预取一条消息,从而保留执行顺序。
关于rabbitmq - Celery - RabbitMQ - 执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302442/