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

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

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

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

Состояния брокера как типы и то, что каждый переход делает в протоколеБрокерВ протоколеAmqpBroker::new(url)ConnectedAmqpBrokerЗавершён:Ok(()) или самаявнутренняя ошибкаЗаписывает URL,SASL, id контейнера;без ввода-выводаСокет, TLS, SASL,open и сеансиздателейНа каждую подписку:сеанс, получательи задача приёмаПервая публикацияв адрес присоединяетотправляющую связьЗадачи приёмазакрывают сеансы,связи закрываются,сеанс завершается,затем соединениеИздатель, сохранённый до connect или после shutdown,отвечает AmqpError::NotConnected, а не молчаливым успехом
Схема текстом
  1. Брокер: AmqpBroker::new (url); ConnectedAmqpBroker; Завершён: Ok(()) или самая внутренняя ошибка
  2. В протоколе: Записывает URL, SASL, id контейнера; без ввода-вывода; Сокет, TLS, SASL, open и сеанс издателей; На каждую подписку: сеанс, получатель и задача приёма; Первая публикация в адрес присоединяет отправляющую связь; Задачи приёма закрывают сеансы, связи закрываются, сеанс завершается, затем соединение
  3. AmqpBroker::new (url) → ConnectedAmqpBroker: connect(self)
  4. ConnectedAmqpBroker → Завершён: Ok(()) или самая внутренняя ошибка: shutdown(self)
  5. Записывает URL, SASL, id контейнера; без ввода-вывода → Сокет, TLS, SASL, open и сеанс издателей
  6. Сокет, TLS, SASL, open и сеанс издателей → На каждую подписку: сеанс, получатель и задача приёма
  7. На каждую подписку: сеанс, получатель и задача приёма → Первая публикация в адрес присоединяет отправляющую связь
  8. Первая публикация в адрес присоединяет отправляющую связь → Задачи приёма закрывают сеансы, связи закрываются, сеанс завершается, затем соединение
  9. Издатель, сохранённый до connect или после shutdown, отвечает AmqpError::NotConnected, а не молчаливым успехом

new не выполняет ввода-вывода, поэтому билдер сервиса остаётся синхронным. Рантайм подключает брокер при старте приложения. Подключение разбирает URL, открывает сокет, проходит аутентификацию, открывает соединение и начинает сеанс, который делят издатели. Если URL не разбирается, сокет не открывается или брокер отклоняет вход, старт возвращает ошибку AmqpError::Connect.

Дескриптор каждой подписки разрешается один раз, по подключённому брокеру. Пустой адрес отклоняется до любого ввода-вывода. Подписка начинает сеанс, присоединяет принимающую связь со своим кредитом и запускает задачу приёма, которая владеет этой связью. Если брокер отклоняет присоединение, старт возвращает ошибку AmqpError::Attach с именем адреса.

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

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

Брокер, скопированный до подключения, делит соединение со своей копией. Копия, которую обвязка тестов подключила внутри процесса, после этого не может подключиться к серверу, и обратный порядок тоже отклоняется.