Основные данныеФоновая работа

Очереди задач

Очереди FIFO, которые не теряют задачи, когда рабочий процесс умирает, с параллельной работой производителей и потребителей.

LPUSH/с с конвейером, измерено
31.6M
задач потеряно при сбое
0
опросов
0
Шаг 1 из 5
Производители отправляют задачи

Любой сервис добавляет работу, не дожидаясь потребителей.

Пример сеансаplaying
# Производители отправляют задачи
hotkv> LPUSH queue:emails "{\"to\":\"ada@example.com\",\"tpl\":\"welcome\"}"
(integer) 18

Анимированная демонстрация с настоящими командами HotKV и примерами ответов. Нажмите на любой шаг, чтобы перейти к нему. Команды и ответы остаются на английском, ровно так, как вы вводите и видите их в HotKV.

Проблема

Фоновой работе, такой как письма, изменение размера изображений и вебхуки, нужна очередь между кодом, который её создаёт, и кодом, который её выполняет. Очередь, теряющая задачу при сбое воркера посреди работы, хуже отсутствия очереди, потому что никто не замечает, что задача пропала.

Как с этим справляется HotKV

Списки дают простую очередь FIFO. BLMOVE перемещает каждую задачу в список обработки в момент передачи воркеру, так что задача в работе всегда где-то хранится, если этот воркер исчезнет. Производители и потребители обслуживаются параллельными рабочими потоками.

Шаг за шагом

Что происходит, команда за командой

  1. 01

    Производители отправляют задачи

    Любой сервис добавляет работу, не дожидаясь потребителей.

    LPUSH queue:emails "{\"to\":\"ada@example.com\",\"tpl\":\"welcome\"}"
  2. 02

    Воркер безопасно берёт задачу

    BLMOVE блокируется, пока не появится задача, затем за один шаг перемещает её в список обработки.

    BLMOVE queue:emails queue:emails:processing RIGHT LEFT 0
  3. 03

    Подтверждаем по завершении

    Письмо ушло. Задача удаляется из списка обработки.

    LREM queue:emails:processing 1 "{\"to\":\"ada@example.com\",\"tpl\":\"welcome\"}"
  4. 04

    Воркер падает

    Воркер 2 умирает посреди задачи. Его задача всё ещё в списке обработки, не потеряна.

    LRANGE queue:emails:processing 0 -1
  5. 05

    Возвращаем в очередь и продолжаем

    Монитор возвращает брошенную задачу в очередь, и другой воркер подхватывает её.

    LMOVE queue:emails:processing queue:emails LEFT RIGHT
Где это уместно

Реальные сценарии

Транзакционные письма и SMS

Сообщения о регистрации, чеках и сбросе пароля ставятся в очередь веб-приложением и отправляются пулом воркеров.

Обработка медиа

Загрузки ставятся в очередь на создание миниатюр и перекодирование, и упавший перекодировщик никогда не теряет файл.

Доставка вебхуков

Исходящие вебхуки ставятся в очередь и повторяются, не блокируя запрос, который их вызвал.

Встроено

Что вы получаете

FIFO с блокирующим чтением

LPUSH с BRPOP, и воркеры спят, пока не появится работа.

LPUSHBRPOP

Без потерянных задач

BLMOVE атомарно передаёт каждую задачу в список обработки.

BLMOVELREM

Параллельные производители и потребители

Производители и потребители обслуживаются параллельными рабочими потоками.

Нужно больше?

Для подтверждений, групп потребителей и повторного воспроизведения используйте потоки.

XADDXREADGROUP
Справочник:BLMOVEBRPOPLPUSHLMOVE

Частые вопросы

Что происходит с задачей, если воркер падает?

Если вы берёте задачи через BLMOVE, задача остаётся в списке обработки. Монитор может вернуть в очередь всё, что пробыло там слишком долго.

Нужно ли воркерам опрашивать очередь?

Нет. BRPOP и BLMOVE блокируются, пока не придёт задача, с необязательным тайм-аутом.

Списки или потоки?

Списки - самая простая очередь. Потоки добавляют группы потребителей, подтверждение каждого сообщения и историю. См. сценарий потоковой передачи событий.

Связанные сценарии

Попробуйте на своей нагрузке

HotKV понимает протокол Redis, поэтому вы можете подключить к нему существующий клиент и выполнить те же команды.