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

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

Жизненный цикл

RedisBroker записывает конфигурацию, connect открывает пул, каждая подписка открывает собственный клиент, а завершение работы снимает блокировки и закрывает клиенты.

Три состояния брокера как типы и то, что каждый переход делает в RedisБрокерВ RedisRedisBroker::standalone(url)ConnectedRedisBrokerClosedRedisBrokerconnections_closedТолько конфигурация,без ввода-выводаПул из 4 соединений:публикации, завершенияКаждая подписка:группа создана,собственный клиентПодписка удалена:CLIENT UNBLOCK, QUITЖдёт клиентов чтения,QUIT для пулаИздатель или доставка, пережившие соединение,сразу возвращают RedisError::ShutDown
Схема текстом
  1. Брокер: RedisBroker:: standalone(url); ConnectedRedisBroker; ClosedRedisBroker connections_closed
  2. В Redis: Только конфигурация, без ввода-вывода; Пул из 4 соединений: публикации, завершения; Каждая подписка: группа создана, собственный клиент; Подписка удалена: CLIENT UNBLOCK, QUIT; Ждёт клиентов чтения, QUIT для пула
  3. RedisBroker:: standalone(url) → ConnectedRedisBroker: connect(self)
  4. ConnectedRedisBroker → ClosedRedisBroker connections_closed: shutdown(self)
  5. Только конфигурация, без ввода-вывода → Пул из 4 соединений: публикации, завершения
  6. Пул из 4 соединений: публикации, завершения → Каждая подписка: группа создана, собственный клиент
  7. Каждая подписка: группа создана, собственный клиент → Подписка удалена: CLIENT UNBLOCK, QUIT
  8. Подписка удалена: CLIENT UNBLOCK, QUIT → Ждёт клиентов чтения, QUIT для пула
  9. Издатель или доставка, пережившие соединение, сразу возвращают RedisError::ShutDown

RedisBroker::standalone записывает URL и не выполняет ввода-вывода, как и cluster и sentinel, поэтому билдер сервиса остаётся синхронным. Рантайм подключает брокер при запуске приложения. Подключение превращает топологию, учётные данные и настройки TLS в конфигурацию fred и открывает пул из pool соединений, по умолчанию из четырёх. Если сервер недоступен, запуск возвращает ошибку. Брокер, созданный через from_pool, берёт переданный ему пул и подключает его на этом шаге, если сервис ещё не подключил его сам.

Публикации, завершения доставок и команды обработчика идут через пул. Каждая подписка открывает собственный клиент в момент подписки. Подписка на поток или список читает через него, потому что блокирующее чтение (XREADGROUP с BLOCK, BLMOVE, BRPOP) занимает соединение до своего возврата, и публикация, поставленная в очередь за ним, ждала бы весь интервал блокировки. Подписка Pub/Sub получает через него свои сообщения. Подписка на поток создаёт свою группу потребителей ещё в момент подписки.

Когда подписку удаляют, её клиент отправляет CLIENT UNBLOCK через служебное соединение fred. Эта команда прерывает чтение, которое ещё заблокировано на сервере. Затем клиент отправляет QUIT. Блокирующее извлечение, оставленное работать, забрало бы следующую запись для подписки, которую никто не читает.

Каждое соединение переподключается, когда сервер его разрывает, увеличивая паузу от 100 мс до 10 с, а команда, отправленная в это время, ждёт переподключения.

Завершение работы помечает соединение закрытым, ждёт, пока закроется каждый клиент чтения, и отправляет QUIT в пул. ClosedRedisBroker сообщает, сколько соединений пула он закрыл. Издатель, механизм перемотки или доставка, которые пережили соединение, проверяют эту пометку перед отправкой и сразу возвращают RedisError::ShutDown.