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

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

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

ZmqQueue::new записывает конечную точку, connect её проверяет, каждая подписка и каждый издатель, который привязывается к адресу, подключают сокет при старте, а издатель, который подключается сам, - при первой публикации. ZmqFanout и ZmqRpc проходят те же шаги.

Три состояния брокера как типы и то, что каждый переход делает в ZeroMQБрокерВ ZeroMQZmqQueue::new(endpoint)ConnectedZmqQueueClosed = ()Конечная точка записана,без ввода-выводаАдрес проверен:tcp:// или ipc://Каждая подпискапривязываетили подключаетсобственный сокетСокет издателя:bind - при старте,dial - при отправкеПомечено закрытым,сбрасывать нечегоИздатель, переживший соединение, отвечаетZmqError::NotConnected, а не молчаливым успехомУдалённая подписка останавливает свою задачуи освобождает привязанную конечную точку
Схема текстом
  1. Брокер: ZmqQueue::new (endpoint); ConnectedZmqQueue; Closed = ()
  2. В ZeroMQ: Конечная точка записана, без ввода-вывода; Адрес проверен: tcp:// или ipc://; Каждая подписка привязывает или подключает собственный сокет; Сокет издателя: bind - при старте, dial - при отправке; Помечено закрытым, сбрасывать нечего
  3. ZmqQueue::new (endpoint) → ConnectedZmqQueue: connect(self)
  4. ConnectedZmqQueue → Closed = (): shutdown(self)
  5. Конечная точка записана, без ввода-вывода → Адрес проверен: tcp:// или ipc://
  6. Адрес проверен: tcp:// или ipc:// → Каждая подписка привязывает или подключает собственный сокет
  7. Каждая подписка привязывает или подключает собственный сокет → Сокет издателя: bind - при старте, dial - при отправке
  8. Сокет издателя: bind - при старте, dial - при отправке → Помечено закрытым, сбрасывать нечего
  9. Издатель, переживший соединение, отвечает ZmqError::NotConnected, а не молчаливым успехом
  10. Удалённая подписка останавливает свою задачу и освобождает привязанную конечную точку

new не выполняет ввода-вывода, поэтому билдер сервиса остаётся синхронным. Рантайм подключает брокер при старте приложения. Подключение проверяет, что адрес начинается с tcp:// или ipc://, и не открывает ни одного сокета. Другая схема адреса прерывает старт с ошибкой, в которой назван адрес.

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

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

Завершение работы помечает соединение закрытым и возвращается. Этот крейт ничего не буферизует, поэтому сбрасывать нечего, а закрытая форма не содержит отчёта. Издатель, выданный раньше, с этого момента отвечает ZmqError::NotConnected.

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