Как заставить сельдерей повторить попытку, используя того же работника?

Я только начинаю с сельдерея в проекте Django, и я застрял в этой конкретной проблеме: в основном, мне нужно распределить долгосрочную задачу для разных работников. Задача фактически разбивается на несколько этапов, каждый из которых занимает значительное время. Поэтому, если какой-то шаг не удался, я бы хотел, чтобы сельдерей повторил эту задачу, используя того же работника для повторного использования результатов выполненных шагов. Я понимаю, что celery использует маршрутизацию для распределения задач на определенный сервер, но я не могу найти ничего об этой конкретной проблемы. Я использую RabbitMQ в качестве своего брокера.

1 ответов


вы можете использовать каждый экземпляр celeryd из очереди с именем хоста рабочего:

celeryd -l info -n worker1.example.com  -Q celery,worker1.example.com

задает имя worker1.example.com и будет потреблять из очереди с тем же именем, а также очереди по умолчанию (с именем celery).

затем, чтобы направить задачу конкретному работнику, вы можете использовать:

task.apply_async(args, kwargs, queue="worker1.example.com")

аналогично направить повторную попытку:

task.retry(queue="worker1.example.com")

или направить повторную попытку к тому же работнику:

task.retry(queue=task.request.hostname)