Звучит так, как будто любая очередь заданий будет делать то, что вам нужно; Я лично большой поклонник использования Redis для такого рода вещей. Поскольку списки Redis поддерживают порядок вставки, вы можете просто указать LPUSH информацию о вызове RPC в конец списка с любого количества веб-серверов, которые прослушивают вызовы RPC, и где-то еще (в другом процессе/на другом компьютере, я полагаю) RPOP (или BRPOP) и обработать их.
Поскольку Node.js использует полностью асинхронный ввод-вывод, предполагая, что вы не выполняете много обработки в ваших слушателях RPC (то есть вы только слушаете запросы, отправляете ACK и нажимаете на Redis), мой думаю, что Node будет чрезвычайно эффективным при этом.
Отказ от использования Redis для очереди: если вы хотите, чтобы в случае катастрофического сбоя задания не были потеряны, вам нужно будет реализовать немного больше логики; от RPOPLPUSH документации:
Pattern: Надежная очередь
Redis часто используется в качестве сервера обмена сообщениями для выполнения обработки фоновых заданий или других видов сообщений задач. Простую форму очереди часто получают толкание значений в список со стороны производителя и ожидание этих значений у потребителя с использованием RPOP (с использованием опроса) или BRPOP, если клиент лучше , обслуживаемый операцией блокировки.
Однако в этом контексте полученного очередь не является надежной, как сообщения могут быть потеряны, например, в случае существует проблема сети или если потребитель авария только после того, как сообщения получено, но он по-прежнему обрабатывать ,
RPOPLPUSH (или BRPOPLPUSH для варианта блокировки) предлагает способ избежать этой проблемы : потребитель получает сообщение и в то же время отталкивает его в список обработки. Он будет использовать команду LREM, чтобы удалил сообщение из списка обработки после обработки сообщения .
Дополнительный клиент может контролировать список обработки для элементов, которые остаются там слишком долго, и в случае необходимости вытащите их в очередь .
Итак, шаблон касается запроса RPOPLPUSH с сервера, который выполняет фактическую обработку сообщений, но что происходит с другим списком? Уничтожается ли он после его завершения? – AlfredoVR
RPOPLPUSH - это всего лишь способ гарантировать, что, если рабочий сбой, вы можете узнать об этом позже и повторно обработать неудавшееся задание. Если задание выполнено успешно, и вы удаляете элемент из временного списка, он автоматически уходит (как и все списки в Redis). Таким образом, если каждый элемент в очереди будет потреблен, список исчезнет, и BRPOP будет блокироваться до тех пор, пока в список не будет добавлен новый элемент (и список будет воссоздан). –
Вот отличная запись на SO шаблона: http://stackoverflow.com/a/8555671/62082 –