Q : Как запрашивающий сокет должен получить ответ без блокировки, при гарантии сообщение не предназначено для другого клиента?
Добро пожаловать в Zen-of-Zero (включая нулевую гарантию)
Помимо стратегий, как обойти взаимные тупики, REQ/REP
dFSA наверняка попадет (кто-то просто не знает, как скоро это произойдет, но это произойдет), где я всегда предпочитаю двустороннее неблокирующее .poll()
-пред- .recv()
циклическое сканирование, гарантировано - " доставка " - и - " маршрутизация " - проблема на другом уровне.
REQ/REP
(задокументировано в ZMTP / RFC (28)) сам по себе работает следующим образом:
Каждый отправленный запрос циклически разбирается среди всех служб, и каждый полученный ответ сопоставляется с последним выданным запросом.
Если сервисы недоступны, любая операция отправки в сокете блокируется до тех пор, пока не станет доступен хотя бы один сервис. Сокет REQ не должен сбрасывать сообщения.
, наблюдаемый на стороне REQ.send()
, и
Каждый полученный запрос является справедливой очередьюиз всех клиентов, и каждый отправленный ответ направляется клиенту, который отправил последний запрос. Если первоначальный запросчик больше не существует, ответ молча отбрасывается.
наблюдается на стороне REP.recv()
.
Последнее предложение решило незаконно присвоенную доставкудля случаев, когда сторона REQ
перестала существовать непосредственно перед вызовом REP.send()
.
Сообщения, с другой стороны,
могут содержать самопроверку соответствующей доставки (можно проверить 'Например, перед принятием решения {process | забудьте})
может содержать криптографически гарантированную форму «спасения вашей шеи» для случаев, когда полезные данные попадают не в те руки (с нулевым значением, если у них нет также «правильного»). «-Ключ) - так можно отправлять всем без греха нарушения любую политику защиты контента (но все же довольно жестокая и« дорогая »стратегия с точки зрения ресурсов, не так ли?)
все,
на самом деле все,
зависит от ваших предпочтений
и уровней надежности, приемлемых с учетом уровня паранойи, связанной с безопасностью (и главным образом из-за разумных уровней), которая была установлена и взаимнопризнан правдоподобным среди всех участников и владельцев рисков, связанных с проблемой домена.
Лучший следующий шаг:
Просмотрите все требования и риски проблемной области, оцените разумную стоимость проблемысмягчения и принять решение о разумной, но рентабельной разработке специализированного пользовательского распределенного протокола уровня приложений, который добавит все требования, которые ZeroMQ сознательно пропустил для включения в интеллектуальные, масштабируемые, почти нулевые латентные архетипы (который может не подходить для использования «как есть», так как любое из ваших требований к высокоуровневым дополнениям вводит больше работы, которая должна быть выполнена до / во время / после того, как сообщение должно было быть доставлено)