Может ли ZeroMQ обеспечить основу для двунаправленной неблокирующей асинхронной передачи?

У меня есть система, состоящая из двух приложений. В настоящее время два приложения обмениваются данными, используя несколько шаблонов ZeroMQ PUB/SUB, созданных для каждого конкретного типа передачи. Сокеты программируются на C.

Например, приложение X использует архетип формального сокета SUB для получения информации struct от приложения Y и использует другой PUB. strong> архетип формального сокета для передачи необработанных битовых блоков в AppY, и то же самое относится к AppY. Он использует шаблоны PUB/SUB для передачи и приема.

Чтобы было ясно, AppX и AppY осуществляют следующие коммуникации:

AppX -> AppY:
- необработанные битовые блоки 1 kbits (непрерывно),
- целочисленная команда (не непрерывно, зависит от пользователя)

AppY -> AppX:
информация struct о 10kbits (непрерывно)


Цель дизайна:

а) Моя цель — использовать только по одному сокету с каждой стороны для двунаправленной связи в неблокирующем режиме.
б) Мне нужны два приложения. для обработки полученных в очереди пакетов без чрезмерной задержки.
c) Я не хочу, чтобы AppX аварийно завершал работу после аварийного AppY.


Q1: Возможно ли это с ZeroMQ?
Q2: Могу ли я использовать ROUTER/DEALER или любой другой шаблон для этой работы?

Я прочитал руководство, но я не мог понять некоторые аспекты.

На самом деле я не очень хорошо разбираюсь в ZeroMQ. Буду рад услышать о дополнительных советах по этой проблеме.


person blackmore_24    schedule 22.06.2016    source источник
comment
Этот вопрос касается не столько C, сокетов и т. д., сколько дизайна алгоритмов. Не подходит для этого форума. Попробуй ссылку, она на обмен стеком программистов.   -  person ryyker    schedule 22.06.2016
comment
спасибо, попробую по указанной вами ссылке.   -  person blackmore_24    schedule 22.06.2016


Ответы (2)


A1: Да, это возможно в ZeroMQ или nanomsg типах инструментов

И ZeroMQ, и его младшая сестра nanomsg разделяют видение
Масштабируемости (что вы еще не подчеркнули)
Формального (запрограммированного формального поведения)< br>Общение (да, именно об этом)
Шаблон (грамотно вырезанный и готовый к повторному использованию и комбинированию по мере необходимости)

Тем не менее, если вы предпочитаете иметь только один шаблон сокета на каждой «стороне», тогда вам нужно выбрать такой формальный шаблон, который оставил бы вам полную свободу от любого жестко запрограммированного поведения для достижения вашей цели.

Таким образом, a) "...только один" выполним - соло zmq.PAIR (что в некоторых частях документации отмечено как все еще экспериментальное устройство) или NN.BUS или пару PUSH/PULL, если вы откажетесь от разрешения только одного (что на самом деле устраняет все крутые возможности совместного использования zmq.Context() экземпляра потока ввода-вывода( s) для повторного использования низкоуровневого механизма ввода-вывода. Если вы потратите несколько минут на примеры, упомянутые ниже, вы вскоре поймете, что прямо противоположная политика довольно распространена и выгодна для целей проектирования, когда в системной архитектуре используется больше и даже больше шаблонов.

a) "...неблокирующий" выполним, указав правильные директивы zmq.NOBLOCK для соответствующих .send() / .recv() функций и используя быстрые, неблокирующие .poll() циклы в вашем приложении. дизайн архитектуры.

Вопрос b) "...без... задержки" связан с очень известным замечанием об архитектуре проектирования приложений, поскольку вы можете потерять это, просто полагаясь на плохой выбор и/или невозможная настройка внутренних таймингов обработчика событий и штрафов за задержку. Если вы тщательно сформируете свой дизайн, вы можете сохранить полный контроль над задержкой / задержкой, которую будет испытывать ваша система, и не стать жертвой цикла событий черного ящика любой среды, где вы можете только ждать сюрпризов на тяжелой системе. или транспортные нагрузки.

На c) "... сбой X после сбоя Y" выполним на { ZeroMQ | nanomsg }-grounds путем тщательного сочетания неблокирующего режима всех функций + вашего дизайна. способен обрабатывать исключения в ситуациях, когда он не получает никаких POS_ACK от предполагаемой { local | remote }-функциональности. Именно в этом отношении будет справедливо отметить, что некоторые из формальныхобычных Cкоммуникационных Pфакторов не обладают такой гибкостью из-за к какому-то обязательному внутреннему поведению, которое "жестко запрограммировано" внутри, поэтому следует с должным вниманием отнестись к выбору правильного FCP-архетипа для каждой такой еще масштабируемой, но отказоустойчивой роли.


Q2: No.


Лучший следующий шаг:

Вас могут заинтересовать другие ZeroMQ сообщений здесь и также не пропустите ссылку на указанную там книгу >>>

person user3666197    schedule 24.06.2016
comment
Большое спасибо за Вашу помощь. Я проведу с этим время и посмотрю, смогу ли я с этим справиться. еще раз спасибо. - person blackmore_24; 29.06.2016
comment
Добро пожаловать, @blackmore_24. StackOverflow поощряет пользователей выражать мнение о том, что пост полезен. вдохновляющим или столь же полезным, поставив UpVote [ +1 ], будь то вопрос или ответ. Не стесняйтесь делать это всякий раз, когда вы найдете материалы сообщества полезными для расширения своих знаний. Наслаждайтесь тем, что вносите свой вклад в это великое Сообщество знаний. - person user3666197; 29.06.2016

Q1: да
Q2: нет, ZMQ_DEALER должен использоваться как приложением X, так и приложением Y. См. http://zguide.zeromq.org/c:asyncsrv. Обратите внимание, что ZMQ_ROUTER в этом примере просто предназначен для распределения запроса от мультиклиента к другому потоку, где ZMQ_DEALER выполняет реальную работу.

person Hongjun Yang    schedule 02.06.2017