Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Устройство
Где стоит ruststream-fred: между рантаймом RustStream и клиентом fred, собственный клиент на
каждую подписку, один общий пул.
Схема текстом
- Ваш сервис: #[subscriber] обработчики; RustStream::new(..) .with_broker(..)
- Ядро RustStream: Рантайм: диспетчер, декодирование, завершение
- ruststream-fred: Подписчики потоков, списков и каналов; Издатели тех же трёх форм; RedisStream RedisList RedisPubSub; Окно конвейера .pipeline(); RedisBroker топология, пул, учётные данные
- fred: Собственный клиент на подписку; Пул 4 соединения
- #[subscriber] обработчики → Рантайм: диспетчер, декодирование, завершение: монтируются
- Рантайм: диспетчер, декодирование, завершение → Подписчики потоков, списков и каналов: опрашивает
- Рантайм: диспетчер, декодирование, завершение → Издатели тех же трёх форм: публикует
- Подписчики потоков, списков и каналов → Собственный клиент на подписку
- Издатели тех же трёх форм → Пул 4 соединения
- Собственный клиент на подписку → Redis или Valkey: одиночный, кластер, Sentinel
- Пул 4 соединения → Redis или Valkey: одиночный, кластер, Sentinel
Крейт реализует трейты брокера из ядра поверх fred. Рантайм над ним один для всех брокеров. Всё, что относится к Redis, находится в этом крейте: дескрипторы трёх транспортов, смысл подтверждения в каждом из них, адрес копии для переобработки и окно конвейера.
Дескриптор разрешается один раз, при запуске, по подключённому брокеру и даёт подписчика. Подписчик - поток доставок, который рантайм опрашивает. Рантайм декодирует каждую доставку, вызывает обработчик и завершает доставку с его исходом. Политика публикации конструирует издателя и при запуске инстанцирует его на подключённом брокере.
Каждая подписка читает через собственный клиент, поэтому заблокированное чтение никогда не задерживает публикацию. Публикации, завершения доставок и команды обработчика делят общий пул. Когда открывается и закрывается каждый клиент, показывает страница Жизненный цикл, а путь одной записи - страница Путь.
Запись потока хранит полезную нагрузку в поле _payload, а каждый заголовок - в поле
h:<name>, поэтому XADD и XREADGROUP сохраняют и то и другое. Запись списка и сообщение
канала хранят заголовки в обёртке вокруг полезной нагрузки: в двоичном кадре или в конверте
кодека, если дескриптор указывает кодек.