Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Жизненный цикл
AmqpBroker::new записывает конфигурацию, connect
открывает соединение и сеанс издателей, старт присоединяет каждую подписку, а завершение работы
идёт изнутри наружу.
Схема текстом
- Брокер: AmqpBroker::new (url); ConnectedAmqpBroker; Завершён: Ok(()) или самая внутренняя ошибка
- В протоколе: Записывает URL, SASL, id контейнера; без ввода-вывода; Сокет, TLS, SASL, open и сеанс издателей; На каждую подписку: сеанс, получатель и задача приёма; Первая публикация в адрес присоединяет отправляющую связь; Задачи приёма закрывают сеансы, связи закрываются, сеанс завершается, затем соединение
- AmqpBroker::new (url) → ConnectedAmqpBroker: connect(self)
- ConnectedAmqpBroker → Завершён: Ok(()) или самая внутренняя ошибка: shutdown(self)
- Записывает URL, SASL, id контейнера; без ввода-вывода → Сокет, TLS, SASL, open и сеанс издателей
- Сокет, TLS, SASL, open и сеанс издателей → На каждую подписку: сеанс, получатель и задача приёма
- На каждую подписку: сеанс, получатель и задача приёма → Первая публикация в адрес присоединяет отправляющую связь
- Первая публикация в адрес присоединяет отправляющую связь → Задачи приёма закрывают сеансы, связи закрываются, сеанс завершается, затем соединение
- Издатель, сохранённый до connect или после shutdown, отвечает AmqpError::NotConnected, а не молчаливым успехом
new не выполняет ввода-вывода, поэтому билдер сервиса остаётся синхронным. Рантайм подключает
брокер при старте приложения. Подключение разбирает URL, открывает сокет, проходит
аутентификацию, открывает соединение и начинает сеанс, который делят издатели. Если URL не
разбирается, сокет не открывается или брокер отклоняет вход, старт
возвращает ошибку
AmqpError::Connect.
Дескриптор каждой подписки разрешается один раз, по подключённому брокеру. Пустой адрес
отклоняется до любого ввода-вывода. Подписка начинает сеанс, присоединяет принимающую связь со
своим кредитом и запускает задачу приёма, которая владеет этой связью. Если брокер отклоняет
присоединение, старт возвращает ошибку AmqpError::Attach с именем адреса.
Отправляющую связь присоединяет первая публикация в её адрес, а не старт. Сервис, который только читает, не присоединяет ни одной.
Завершение работы помечает соединение закрытым и разбирает его изнутри наружу. Каждая задача приёма отсоединяет свою связь и завершает свой сеанс, затем закрываются отправляющие связи, завершается сеанс издателей, и последним закрывается соединение. Пока закрывается внутренний слой, внешний ещё передаёт ему ответы брокера. Каждый шаг выполняется, даже если предыдущий вернул ошибку, и наружу возвращается самая внутренняя ошибка. Подписка, открытая в момент завершения, выдаёт доставки, которые держит, и заканчивается. Если урегулировать такую доставку после этого, урегулирование вернёт ошибку.
Брокер, скопированный до подключения, делит соединение со своей копией. Копия, которую обвязка тестов подключила внутри процесса, после этого не может подключиться к серверу, и обратный порядок тоже отклоняется.