Справка по дизайну сельдерея: как предотвратить одновременное выполнение задач - PullRequest
5 голосов
/ 21 марта 2012

Я довольно новичок в 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 и т. Д.

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

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

1 Ответ

3 голосов
/ 22 марта 2012

Что плохого в использовании внешнего механизма блокировки?Это просто, понятно и достаточно эффективно.Вы можете найти пример блокировки распределенных задач в Celery здесь .Расширьте его, создав блокировку для каждого пользователя, и все готово!

...