Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Очереди
Надёжный список переносит каждую запись в список обработки до запуска обработчика и удаляет её оттуда, когда обработчик завершает доставку.
Схема текстом
- Производитель → jobs: LPUSH
- jobs → jobs.processing: BLMOVE
- jobs.processing → Обработчик: доставка
- jobs.processing → Восстановление: по времени захвата: ZADD
- Восстановление: по времени захвата → jobs: возврат
- Обработчик → ack: LREM
- Обработчик → retry: LPUSH, затем LREM
- Обработчик → drop: LREM
- Чтение сначала возвращает в очередь захваты старше min_idle
Список - очередь: LPUSH добавляет запись с одного конца, извлечение забирает её с другого, и
первой уходит самая старая запись. Извлечённая запись из Redis исчезает. Простой
RedisList извлекает записи командой BRPOP, поэтому
запись теряется, если её обработчик возвращает ошибку или процесс аварийно завершается: доставка
выполняется не более одного раза.
Надёжный список не извлекает запись, а
захватывает её. BLMOVE одной командой переносит запись из очереди в список обработки, и запись
остаётся там, пока работает обработчик. Список обработки называется <key>.processing, если
подписка не задаёт другое имя. Исход завершает запись в списке обработки: LREM удаляет её, а
при переобработке запись сначала возвращается в очередь. Доставка выполняется не менее одного
раза. Redis описывает этот приём на странице команды
LMOVE.
Список не помнит, кто и когда взял запись, поэтому запись потребителя, который аварийно
завершился после захвата, остаётся в списке обработки. Этот учёт ведёт
recovery_zset. Каждый захват
добавляется в упорядоченное множество с оценкой, равной времени захвата. Каждое чтение сначала
находит захваты старше min_idle и возвращает их записи в очередь командами LREM и LPUSH, не
больше 128 за одно чтение.
В кластере оба списка должны попадать в один слот, потому что BLMOVE работает с обоими
ключами. Подписка, у которой два ключа попадают в разные слоты, прерывает запуск. Хеш-тег вроде
{jobs} помещает оба ключа в один слот, и имя списка обработки по умолчанию его наследует.