Я оцениваю сельдерей для своего рабочего процесса очереди задач. Мои требования немного уникальны. В системе есть понятие проектов, и каждый проект будет иметь (потенциально большое) количество связанных с ним задач. Я хотел бы, чтобы система очередей распределяла эти задачи справедливым образом, чтобы один проект с очень большим количеством задач для обработки не приводил к голоданию других проектов.
Например, предположим, что ProjectA имеет 100 связанных с ним задач, и все эти задачи отправляются одновременно. Первые 5 задач снимаются и передаются 5 рабочим. Пока обрабатываются первые 5 задач, ProjectB отправляется с еще 100 задачами. ProjectB не должен ждать, пока ProjectA выполнит все 100 своих задач, чтобы получить некоторое время обработки. Вместо этого, как только рабочий становится свободным, он должен обрабатывать задачу ProjectB. Затем следующий рабочий, который освободится, должен выполнить задачу ProjectA и т. д. в циклическом режиме.
Я думал, что могу динамически создавать новые очереди для каждого проекта и заставлять всех рабочих извлекать из всех очередей, как описано в это сообщение SO. Однако, согласно этому ответу, работники сельдерея фактически будут обрабатывать задачи в том порядке, в котором они были отправлены, независимо от очереди, в которой они находятся. (что мне тоже кажется немного странным). Это не работает для меня, потому что это приведет к голоданию проектов, отправленных после того, как текущий обрабатывается.
Можно ли использовать Celery для реализации моих требований? Если нет, есть ли рекомендуемая передовая практика для реализации моих требований?