Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Устройство
Где стоит ruststream-lapin: между рантаймом RustStream и клиентом lapin, одно соединение, свой
канал у каждой подписки.
Схема текстом
- Ваш сервис: #[subscriber] обработчики-подписчики; RustStream::new(..) .with_broker(..)
- Ядро RustStream: Рантайм: диспетчер, партиции, подтверждения
- ruststream-lapin: LapinSubscriber выдаёт LapinMessage; LapinPublisher, ConfirmsPublisher, ServerTxPublisher; LapinBroker конфигурация; RabbitQueue, RabbitQuorumQueue, RabbitExchange; LapinRequester
- lapin: Connection одно на брокер; Свой канал у каждой подписки; Один канал публикации; свои - у подтверждений, транзакций, запросов
- #[subscriber] обработчики-подписчики → Рантайм: диспетчер, партиции, подтверждения: монтируются
- Рантайм: диспетчер, партиции, подтверждения → LapinSubscriber выдаёт LapinMessage: опрашивает поток
- LapinSubscriber выдаёт LapinMessage → Свой канал у каждой подписки
- LapinPublisher, ConfirmsPublisher, ServerTxPublisher → Один канал публикации; свои - у подтверждений, транзакций, запросов
- LapinRequester → Один канал публикации; свои - у подтверждений, транзакций, запросов
- Свой канал у каждой подписки → Узел RabbitMQ
- Один канал публикации; свои - у подтверждений, транзакций, запросов → Узел RabbitMQ
Крейт реализует трейты брокера из ядра поверх lapin, клиента AMQP 0.9.1 на чистом Rust. Рантайм над ним один для всех брокеров. Всё, что относится к RabbitMQ, находится в этом крейте: дескрипторы очередей, кадры, которые отправляет подтверждение, адрес копии для переобработки и три режима публикации.
Один брокер открывает одно соединение. Каждая подписка читает очередь через собственный канал, поэтому её окно предвыборки и её ошибки касаются только её. Издатели без подтверждения доставки делят один канал. Издатель с подтверждениями, транзакционный издатель и запрашивающая сторона открывают собственный канал при первом использовании, потому что режим подтверждений, транзакция и потребитель ответов - это состояние канала.
Ошибка канала закрывает один канал, а соединение остаётся открытым. Канал издателя открывается заново при следующем использовании, поэтому одна публикация в несуществующий обменник не мешает сервису публиковать дальше.
LapinBroker по умолчанию ничего не объявляет. Тогда
дескриптор описывает топологию, которую ожидает сервис, а подписка на несуществующую очередь
возвращает ошибку.
declare_topology(true) включает
объявление: каждая подписка объявляет свои обменники, свою очередь и свои привязки, именно в
этом порядке.
Запрашивающая сторона читает ответы в задаче на том рантайме, где брокер подключился, из какого бы потока ни пришёл первый запрос.
Как части запускаются и останавливаются, показывает страница Жизненный цикл, а путь одной доставки - страница Путь.