Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Жизненный цикл
Состояния брокера - это типы: конфигурация, соединение и закрытое соединение. В каждое ведёт вызов, который поглощает предыдущее.
Схема текстом
- Брокер: B::new(config) без ввода-вывода; B::Connected subscribe, publish; Closed отчёт о закрытии
- Приложение: Сборщик регистрирует брокеры и обработчики; RunningApp соединения открыты, циклы работают; Остановлено циклы опустели, брокеры закрыты
- B::new(config) без ввода-вывода → B::Connected subscribe, publish: connect(self)
- B::Connected subscribe, publish → Closed отчёт о закрытии: shutdown(self)
- Сборщик регистрирует брокеры и обработчики → RunningApp соединения открыты, циклы работают: start()
- RunningApp соединения открыты, циклы работают → Остановлено циклы опустели, брокеры закрыты: shutdown()
- Издатель, переживший соединение своего брокера, отвечает ошибкой, а не молчаливым успехом
Брокер создаётся без ввода-вывода, поэтому сборщик
#[ruststream::app] остаётся синхронным с любым
брокером. Все сетевые вызовы ждут start().
Подписка и публикация - методы только подключённой формы. У кода, который держит брокер до
connect, подписываться нечем, а shutdown поглощает закрываемое соединение. Поэтому такие
ошибки не компилируются.
start() подключает брокеры в порядке
регистрации, открывает каждую подписку на своём подключённом брокере и запускает хуки
after_startup. Если на этом пути что-то падает, уже открытое закрывается в обратном порядке.
shutdown() останавливает циклы, дожидается
их опустошения и закрывает брокеры в обратном порядке регистрации. Где выполняется каждый
хук, показано на странице
Асинхронность.
Издатель, выданный раньше, может пережить соединение. После завершения работы он возвращает ошибку. Набор проверок соответствия требует этого от каждого крейта брокера.