Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Очереди

Надёжный список переносит каждую запись в список обработки до запуска обработчика и удаляет её оттуда, когда обработчик завершает доставку.

Надёжный список: захват переносит запись в список обработки, исход завершает её там, а множество для восстановления возвращает брошенные записиПроизводительjobsjobs.processingВосстановление:по времени захватаОбработчикack:LREMretry: LPUSH,затем LREMdrop:LREMЧтение сначала возвращает в очередь захваты старше min_idle
Схема текстом
  1. Производитель → jobs: LPUSH
  2. jobs → jobs.processing: BLMOVE
  3. jobs.processing → Обработчик: доставка
  4. jobs.processing → Восстановление: по времени захвата: ZADD
  5. Восстановление: по времени захвата → jobs: возврат
  6. Обработчик → ack: LREM
  7. Обработчик → retry: LPUSH, затем LREM
  8. Обработчик → drop: LREM
  9. Чтение сначала возвращает в очередь захваты старше min_idle

Список - очередь: LPUSH добавляет запись с одного конца, извлечение забирает её с другого, и первой уходит самая старая запись. Извлечённая запись из Redis исчезает. Простой RedisList извлекает записи командой BRPOP, поэтому запись теряется, если её обработчик возвращает ошибку или процесс аварийно завершается: доставка выполняется не более одного раза.

Надёжный список не извлекает запись, а захватывает её. BLMOVE одной командой переносит запись из очереди в список обработки, и запись остаётся там, пока работает обработчик. Список обработки называется <key>.processing, если подписка не задаёт другое имя. Исход завершает запись в списке обработки: LREM удаляет её, а при переобработке запись сначала возвращается в очередь. Доставка выполняется не менее одного раза. Redis описывает этот приём на странице команды LMOVE.

Список не помнит, кто и когда взял запись, поэтому запись потребителя, который аварийно завершился после захвата, остаётся в списке обработки. Этот учёт ведёт recovery_zset. Каждый захват добавляется в упорядоченное множество с оценкой, равной времени захвата. Каждое чтение сначала находит захваты старше min_idle и возвращает их записи в очередь командами LREM и LPUSH, не больше 128 за одно чтение.

В кластере оба списка должны попадать в один слот, потому что BLMOVE работает с обоими ключами. Подписка, у которой два ключа попадают в разные слоты, прерывает запуск. Хеш-тег вроде {jobs} помещает оба ключа в один слот, и имя списка обработки по умолчанию его наследует.