Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Группы
Группа потребителей читает поток с одним курсором и хранит в списке неподтверждённых записей каждую запись, которую доставила и которую никто не подтвердил.
Схема текстом
- Поток orders глазами группы workers: 1-0 ack; 2-0 ack; 3-0 ждёт; 4-0 ждёт; 5-0 новая; 6-0 новая
- Курсор: last-delivered-id → 4-0 ждёт: указывает на
- Потребитель c1 читает новые → Курсор: last-delivered-id: XREADGROUP
- Потребитель c2 подтверждает → PEL: неподтверждённые 3-0 у c1, 4-0 у c2: XACK
- Потребитель c3 перехватывает → PEL: неподтверждённые 3-0 у c1, 4-0 у c2: перехват
- XGROUP SETID сдвигает курсор назад или вперёд: перемотка
XREADGROUP с идентификатором > возвращает записи после курсора группы, её
last-delivered-id, и сдвигает курсор. Каждая запись достаётся тому потребителю, который её
прочитал. Группа заносит запись в свой список неподтверждённых записей (PEL) вместе с этим
потребителем, временем доставки и счётчиком доставок. XACK удаляет её из списка. Сама запись
остаётся в потоке: подтверждение - это учёт группы, а не удаление.
Крейт создаёт группу при запуске подписки командой XGROUP CREATE с MKSTREAM, поэтому поток,
которого ещё нет, создаётся пустым. Уже существующая группа остаётся как есть.
StreamStart задаёт, откуда начинается курсор новой
группы.
Запись, потребитель которой аварийно завершился, остаётся в списке. Две команды передают её
другому потребителю, когда она простаивает дольше заданного времени. XAUTOCLAIM находит такие
записи в списке и передаёт их. Так читает
RedisStream::reclaim, а счётчики доставок
перехваченных записей он запрашивает командой XPENDING. В Redis 8.4 и новее XREADGROUP
принимает параметр CLAIM: один вызов возвращает сначала простаивающие записи, затем новые, и у
каждой указаны время простоя и счётчик доставок. Так читает
RedisStream::claiming, а подписка с
перехватом на более старом сервере прерывает запуск.
XGROUP SETID сдвигает курсор. Им пользуется
RedisGroupSeeker, поэтому перемотка переставляет всю
группу, а не одного потребителя. Результат чтения, полученный по старому курсору, отбрасывается,
и следующее чтение начинается с нового.
Это собственные команды Redis: XREADGROUP, XACK, XAUTOCLAIM и XGROUP SETID.