Сценарий (я упростил):
- Многие конечные пользователи могут запускать задания (тяжелые задания, например рендеринг большого PDF файла), из внешнего веб-приложения (производителя).
- Задачи отправляются в одну простую очередь RabbitMQ.
- Многие рабочие приложения (потребители) обрабатывают эти задания и записывают результаты обратно в хранилище данных.
Этот довольно стандартный шаблон работает нормально.
Проблема: если пользователь запустил 10 заданий за одну минуту, и в это время дня работает только 10 рабочих приложений, этот конечный пользователь эффективно берет на себя все время вычисления.
Вопрос. Как я могу убедиться, что только одно задание на конечного пользователя обрабатывается в любое время? ( Бонус: некоторые конечные пользователи (например, админы) не должны быть дросселированы)
Кроме того, я не хочу, чтобы приложение переднего конца блокировало конечных пользователей от запуска параллельных заданий. Я просто хочу, чтобы конечные пользователи дождались, что их параллельные задания будут завершены по одному за раз.
Решение?. Должен ли я динамически создавать одну автоматическую удаление эксклюзивной очереди для конечных пользователей? Если да, как я могу сообщить рабочим приложениям начать использовать эту очередь? Как обеспечить, чтобы один (и только один) рабочий из этой очереди потреблял?