Это хорошо известный шаблон для использования LPUSH
и BRPOPLPUSH
(http://redis.io/commands/rpoplpush) для реализации прочной очереди в Редисе. Тем не менее, для того, чтобы увеличить масштаб, дизайн должен обслуживать нескольких работников/потребителей, которые BRPOPLPUSH
из главной очереди задач.Управление работниками для надежной очереди в Redis
Таким образом, норма, как правило, заключается в том, что для каждого работника есть отдельный processing_queue
, который записывает задачу, над которой работает конкретный работник, так что работник отслеживает, что остается делать, если он выходит во время обработки.
У меня есть два вопроса относительно этого processing_queue
:
это правильно рассуждать, что будет не более одного элемента/задач в любое время работник
processing_queue
? Я предполагаю, что рабочий начинает с проверки любой оставшейся задачи в своемprocessing_queue
доBRPOPLPUSH
главной очереди задач. Если это так, мы можем использовать любой изRPOP
,LPOP
,LREM
, чтобы удалить задачу после завершения обработки работником (или просто удалить список). Мы даже можем использовать набор вместо списка. Есть ли причина, почему так много людей предпочитают использоватьLREM
, но больше ничего?Я видел, как многие люди рекомендуют идентифицировать человека
processing_queue
, используя идентификатор процесса соответствующего работника. Но что происходит, когда старый работник выходит, а новый появляется с (вероятнее всего) новым идентификатором процесса. Как новый рабочий ищет своего предшественникаprocessing_queue
, чтобы завершить возможную задачу? Я планирую использоватьSupervisor
для управления моими рабочими процессами, если это имеет значение.