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

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

Устройство

Где стоит ruststream-lapin: между рантаймом RustStream и клиентом lapin, одно соединение, свой канал у каждой подписки.

Сверху вниз: сервис, рантайм RustStream, этот крейт, клиент lapin и узел RabbitMQВаш сервисЯдро RustStreamruststream-lapinlapin#[subscriber]обработчики-подписчикиRustStream::new(..).with_broker(..)Рантайм: диспетчер, партиции, подтвержденияLapinSubscriberвыдаёт LapinMessageLapinPublisher,ConfirmsPublisher,ServerTxPublisherLapinBrokerконфигурацияRabbitQueue,RabbitQuorumQueue,RabbitExchangeLapinRequesterConnectionодно на брокерСвой каналу каждой подпискиОдин канал публикации;свои - у подтверждений,транзакций, запросовУзел RabbitMQ
Схема текстом
  1. Ваш сервис: #[subscriber] обработчики-подписчики; RustStream::new(..) .with_broker(..)
  2. Ядро RustStream: Рантайм: диспетчер, партиции, подтверждения
  3. ruststream-lapin: LapinSubscriber выдаёт LapinMessage; LapinPublisher, ConfirmsPublisher, ServerTxPublisher; LapinBroker конфигурация; RabbitQueue, RabbitQuorumQueue, RabbitExchange; LapinRequester
  4. lapin: Connection одно на брокер; Свой канал у каждой подписки; Один канал публикации; свои - у подтверждений, транзакций, запросов
  5. #[subscriber] обработчики-подписчики → Рантайм: диспетчер, партиции, подтверждения: монтируются
  6. Рантайм: диспетчер, партиции, подтверждения → LapinSubscriber выдаёт LapinMessage: опрашивает поток
  7. LapinSubscriber выдаёт LapinMessage → Свой канал у каждой подписки
  8. LapinPublisher, ConfirmsPublisher, ServerTxPublisher → Один канал публикации; свои - у подтверждений, транзакций, запросов
  9. LapinRequester → Один канал публикации; свои - у подтверждений, транзакций, запросов
  10. Свой канал у каждой подписки → Узел RabbitMQ
  11. Один канал публикации; свои - у подтверждений, транзакций, запросов → Узел RabbitMQ

Крейт реализует трейты брокера из ядра поверх lapin, клиента AMQP 0.9.1 на чистом Rust. Рантайм над ним один для всех брокеров. Всё, что относится к RabbitMQ, находится в этом крейте: дескрипторы очередей, кадры, которые отправляет подтверждение, адрес копии для переобработки и три режима публикации.

Один брокер открывает одно соединение. Каждая подписка читает очередь через собственный канал, поэтому её окно предвыборки и её ошибки касаются только её. Издатели без подтверждения доставки делят один канал. Издатель с подтверждениями, транзакционный издатель и запрашивающая сторона открывают собственный канал при первом использовании, потому что режим подтверждений, транзакция и потребитель ответов - это состояние канала.

Ошибка канала закрывает один канал, а соединение остаётся открытым. Канал издателя открывается заново при следующем использовании, поэтому одна публикация в несуществующий обменник не мешает сервису публиковать дальше.

LapinBroker по умолчанию ничего не объявляет. Тогда дескриптор описывает топологию, которую ожидает сервис, а подписка на несуществующую очередь возвращает ошибку. declare_topology(true) включает объявление: каждая подписка объявляет свои обменники, свою очередь и свои привязки, именно в этом порядке.

Запрашивающая сторона читает ответы в задаче на том рантайме, где брокер подключился, из какого бы потока ни пришёл первый запрос.

Как части запускаются и останавливаются, показывает страница Жизненный цикл, а путь одной доставки - страница Путь.