Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Жизненный цикл
ZmqQueue::new записывает конечную точку, connect её
проверяет, каждая подписка и каждый издатель, который привязывается к адресу, подключают сокет при
старте, а издатель, который подключается сам, - при первой публикации.
ZmqFanout и ZmqRpc
проходят те же шаги.
Схема текстом
- Брокер: ZmqQueue::new (endpoint); ConnectedZmqQueue; Closed = ()
- В ZeroMQ: Конечная точка записана, без ввода-вывода; Адрес проверен: tcp:// или ipc://; Каждая подписка привязывает или подключает собственный сокет; Сокет издателя: bind - при старте, dial - при отправке; Помечено закрытым, сбрасывать нечего
- ZmqQueue::new (endpoint) → ConnectedZmqQueue: connect(self)
- ConnectedZmqQueue → Closed = (): shutdown(self)
- Конечная точка записана, без ввода-вывода → Адрес проверен: tcp:// или ipc://
- Адрес проверен: tcp:// или ipc:// → Каждая подписка привязывает или подключает собственный сокет
- Каждая подписка привязывает или подключает собственный сокет → Сокет издателя: bind - при старте, dial - при отправке
- Сокет издателя: bind - при старте, dial - при отправке → Помечено закрытым, сбрасывать нечего
- Издатель, переживший соединение, отвечает ZmqError::NotConnected, а не молчаливым успехом
- Удалённая подписка останавливает свою задачу и освобождает привязанную конечную точку
new не выполняет ввода-вывода, поэтому билдер сервиса остаётся синхронным. Рантайм подключает
брокер при старте приложения. Подключение проверяет, что адрес начинается с tcp:// или ipc://,
и не открывает ни одного сокета. Другая схема адреса прерывает
старт с ошибкой, в которой назван адрес.
Каждая подписка подключает свой сокет, когда открывается. На конечной точке, которую этот сервис привязывает, подписка слушает, и если система отказывает в привязке, старт прерывается. Привязанную конечную точку занимает одна подписка: вторую на том же брокере отвергает ошибка, в которой названы обе. К конечной точке, к которой этот сервис подключается, подписка подключается сама. Её узел - отправляющая сторона паттерна, поэтому с этого момента публикация через тот же брокер отвергается ещё до подключения.
Сервис, который только читает, не подключает сокетов издателя. Издатель, который привязывается к адресу, подключает свой сокет при старте, издатель, который подключается сам, - при первой публикации, и отправка повторяется до пяти секунд, пока соединение с узлом завершает рукопожатие.
Завершение работы помечает соединение закрытым и
возвращается. Этот крейт ничего не буферизует, поэтому сбрасывать нечего, а закрытая форма не
содержит отчёта. Издатель, выданный раньше, с этого момента отвечает
ZmqError::NotConnected.
Подписка останавливается, когда рантайм её удаляет. Удаление останавливает задачу, которая читает её сокет, потому что приём на сокете без узла сам по себе никогда не возвращается. Подписка, которая привязала свою конечную точку, в тот же момент освобождает её, и новая подписка может привязаться к тому же адресу.