Практическое задание

Эта задача — шаг 15 курса «Redis в проде»

Забрать сообщения у упавшего воркера

средне~10 мин

Поток jobs обрабатывает группа workers. Воркер worker-old взял несколько задач и упал — его сообщения уже давно (больше часа) висят неподтверждёнными. Воркер worker-live жив и сейчас обрабатывает свою задачу. Воркер worker-slow тоже жив — он уже около 30 минут считает тяжёлый отчёт, для него это нормально.

Переназначь потребителю worker-new все ожидающие сообщения группы, которые простаивают дольше 1 часа (3600000 мс), — командой XAUTOCLAIM. Затем «обработай» их и подтверди.

Требования:

  • у worker-old не должно остаться ожидающих сообщений;
  • сообщения worker-live и worker-slow трогать нельзя — они должны остаться за своими владельцами неподтверждёнными;
  • сам поток не меняй: ничего не удаляй.
Что потренируешь:
  • redis
  • streams
  • XAUTOCLAIM
  • XPENDING
  • XACK
  • consumer group

Разбор темы

В группе потребителей каждое выданное сообщение числится за конкретным потребителем в списке ожидающих (PEL), пока его не подтвердят XACK. Если воркер упал, его сообщения сами никуда не денутся — они будут висеть вечно. Поэтому в проде нужен «сборщик»: периодически искать сообщения, простаивающие дольше разумного порога, и переназначать их живому воркеру. XAUTOCLAIM делает это за один вызов: сканирует PEL с курсора, забирает всё, что простаивает дольше min-idle-time, и возвращает следующий курсор (0-0 — скан закончен). Порог важен: слишком маленький отберёт задачи у живых, но медленных воркеров, и одна задача будет выполнена дважды. Счётчик доставок (times-delivered в XPENDING) помогает найти «ядовитые» сообщения, которые раз за разом роняют воркеры.

Что проверяется

  1. у worker-old нет ожидающих сообщений
  2. сообщения переданы worker-new через XAUTOCLAIM
  3. worker-new подтвердил полученные сообщения
  4. сообщения worker-live и worker-slow не тронуты
  5. поток jobs не изменён

Как это выглядит