Справка по дизайну Celery: как предотвратить одновременное выполнение задач

Я новичок в Celery/AMQP и пытаюсь придумать дизайн задачи/очереди/работника, отвечающий следующим требованиям.

У меня есть несколько типов задач «на пользователя»: например, TaskA, TaskB, TaskC. Каждая из этих задач «для каждого пользователя» считывает/записывает данные для одного конкретного пользователя в системе. Таким образом, в любой момент мне может понадобиться создать задачи User1_TaskA, User1_TaskB, User1_TaskC, User2_TaskA, User2_TaskB и т. д. Мне нужно убедиться, что для каждого пользователянет двух задач любого типа задач выполняться одновременно. Мне нужна система, в которой ни один рабочий процесс не может выполнять User1_TaskA одновременно с любым другим рабочим процессом, выполняющим User1_TaskB или User1_TaskC, но пока выполняется User1_TaskA, другие рабочие процессы не должны быть заблокированы от одновременного выполнения User2_TaskA, User3_TaskA и т. д.

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

Я полагаю, что одним из возможных решений является реализация очередей в виде пользовательских сегментов таким образом, чтобы при запуске рабочих процессов была конфигурация, указывающая, сколько сегментов нужно создать, и каждый «рабочий процесс сегмента» был привязан ровно к одному сегменту.Затем «промежуточный рабочий» вытаскивал задачи из основной очереди задач и назначал их в очереди с сегментами, скажем, с помощью схемы хеширования/модификации. Таким образом, задачи пользователя А всегда оказывались в одной и той же очереди, а несколько задач для пользователя А дублировались друг за другом. Мне не нравится этот подход, так как он требует, чтобы количество сегментов было определено заранее, и, казалось бы, предотвращает (легко) динамическое добавление рабочих. Мне кажется, что должен быть лучший способ - предложения будут очень признательны.

5
задан Matt 21 March 2012 в 19:58
поделиться