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

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

Группы

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

Одна группа потребителей над потоком: её курсор, список неподтверждённых записей и команды, которые переносят записи между нимиПоток orders глазами группы workers1-0ack2-0ack3-0ждёт4-0ждёт5-0новая6-0новаяКурсор:last-delivered-idPEL: неподтверждённые3-0 у c1, 4-0 у c2Потребитель c1читает новыеПотребитель c2подтверждаетПотребитель c3перехватываетXGROUP SETID сдвигает курсор назад или вперёд: перемотка
Схема текстом
  1. Поток orders глазами группы workers: 1-0 ack; 2-0 ack; 3-0 ждёт; 4-0 ждёт; 5-0 новая; 6-0 новая
  2. Курсор: last-delivered-id → 4-0 ждёт: указывает на
  3. Потребитель c1 читает новые → Курсор: last-delivered-id: XREADGROUP
  4. Потребитель c2 подтверждает → PEL: неподтверждённые 3-0 у c1, 4-0 у c2: XACK
  5. Потребитель c3 перехватывает → PEL: неподтверждённые 3-0 у c1, 4-0 у c2: перехват
  6. 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.