Очереди сообщений ZeroMQ - PullRequest
       89

Очереди сообщений ZeroMQ

0 голосов
/ 25 сентября 2019

Я работаю некоторое время с ZeroMQ.Я уже прочитал несколько статей и многое из руководства, но один вопрос остался для меня открытым:

Допустим, мы используем PUB-SUB.Где или в какой системе находятся очереди сообщений?На стороне системы издателя, на стороне системы подписчика или что-то среднее?

Извините за, возможно, глупый вопрос.Это изображение из документа Брокер против Брокера.

enter image description here

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Q : Где или в какой системе находятся очереди сообщений?

Концепция Zen-of-Zero, asвстроенный ZeroMQ использует разумные и достаточно правильные сопоставления, в зависимости от конкретного случая.

Существуют случаи, когда вообще нет Очереди, как вы их знаете, например:

транспортный класс inproc:// не имеет очереди, как можно знать, поскольку существуют только области памяти, в которые сообщения помещаются и считываются.Таким образом, вся магия появляется внутри специального компонента - экземпляра Context().Там происходит отображение сообщений в память.Случай inproc:// является особым случаем, когда потоки ввода-вывода вообще не нужны, поскольку весь процесс основан исключительно на отображении памяти, а экземпляр Context() манипулирует его внутренними состояниями, чтобыэмулировать как внешне предоставленную абстракцию поведения, подобного очереди, так и внутреннее управление "очередью".

Другие, аналогично, работают с localhost расположенными внутренними конечными точками очереди (-ями):

по очевидной причине, поскольку ZeroMQ - это система без посредников, отсутствует «центральное» место, и все функции распределены по участвующим (скоординированным и взаимодействующим) узлам.

Любой из концов Очереди находится в Context() -экземплярах, один в localhost -области одной стороны, другой в "удаленном" -хосте * Context(), как было объявлено и согласованопри построении указанного сокета-архетипа ZMTP / RFC .bind() / .connect().Поскольку для такого сокета, специфичного для ZMTP, было получено положительное подтверждение, абстракция очереди (реализованная в ) остается в силе, пока такой сокет не получит .close() -ед или Context() -экземпляр не был получен принудительно или случайно .term() -ed.

По этим причинам, необходимые емкость размеры необходимы, как сообщенияможет храниться в памяти, работающей с Context(), до того, как она будет транспортирована по соединению, опосредованному { network | ipc-channel } (на стороне .send()), или до того, как будет .recv() -ед (изнутри удаленного экземпляра Context())с помощью удаленного кода приложения для любого дальнейшего использования данных полезной нагрузки сообщения (возможно управление данными сообщения нулевой копии, однако не все варианты использования действительно используют этот режим для избежания реплицированных выделений памяти и затрат на передачу данных).

0 голосов
/ 25 сентября 2019

Каждый сокет zeromq имеет очереди отправки и получения (ограничения задаются с помощью верхней отметки).

В случае PUB / SUB без посредников сообщения могут помещаться в очередь на отправителе или получателе.

Пример:

  • Если имеется перегрузка сети, отправитель может поставить в очередь свою очередь отправки
  • Если получатель использует сообщения медленнее, чем они приходят, они будут поставлены в очередьв очереди приема получателя

Если очереди достигают верхней отметки, сообщения будут потеряны.

...