В web торчит сервер на Ноде, приходят клиенты и просят ответы. Несколько клиентов часто одновременно просят один и тот же ответ.
Формирование каждого ответа - это очень дорогая задача (быстро упираемся в CPU), задачи выполняются в дочерних процессах, долго. Для максимальной производительности одновременно должны быть запущены от 2х до десятка(ов) задач-процессов - сколько конкретно - задается в настройках.
То есть когда web-сервер получает задачу - он ставит ее в очередь на выполнение, и ждет когда будет готово - подписывается на уведомление о завершении этой задачи. На одну задачу могут подписываться несколько обработчиков http-запросов. Когда она будет готова - все они отдают ответ своим клиентам.
Внешние менеджеры очередей типа Celery не подходят - все должно крутиться внутри одного процесса Ноды (не считая дочерних процессов, которые выполняют задачи).
Состояния задачи - не выполнено/выполнено успешно/выполнено с ошибкой + объект ошибки (типа как промис). Других свойств нет, подписчики знают, откуда брать результаты успешно выполненной задачи.
Паттерн в принципе довольно стандартный, и должны быть уже готовые best practices для Ноды, или хотя бы поделитесь мыслями - куда вообще рыть?
UPD: вроде бы понимание окончательно оформилось:
task = queue.push(taskData(req));
task.on('complete', () => {
// задача выполнена, делаем полезное
}).on('error', err => {
// ошибка, делаем неприятное
});
То есть это очередь EventEmitter'ов, очередь сама разруливает что делать с задачами - добавлять как новую или возвращать существующую. Фиксированное количество воркеров получает задачи из очереди последовательно.