Сельдерей-RabbitMQ-порядок исполнения


Я запускаю некоторые длинные задачи, где мне нужно убедиться, что поставленные в очередь задачи выполняются в порядке приема. Что я обнаружил в своих первых тестах, так это то, что когда я достигаю максимального количества рабочих (CELERYD_CONCURRENCY), следующие задачи, которые отправляются, помещаются в очередь, а затем первая из тех, которые должны быть выполнены, фактически является последней, которая будет получена.

Конечно, противоположное поведение-это то, что Im после того, как самые старые сообщения будут выполнены первыми, когда есть свободный работник.

Чем объясняется такое поведение и как его можно изменить?

1 2

1 ответ:

Это оказалось результатом установки RabbitMQ prefetchCount, которая предварительно выбирает набор сообщений на канал.

Поскольку я использую очередь для длительных задач, я решил проблему, установив CELERYD_PREFETCH_MULTIPLIER в 1, что по умолчанию равно 4, так что только одно сообщение будет предварительно обработано и порядок выполнения сохранен.