广告1) 不行,
在ZeroMQ框架中没有向用户公开任何套接字链接管理接口,以测试/重置FSA到FSA链接状态。
是的,XREQ/XREP
可以帮助您克服可能会发生的REQ/REP
可扩展正式通信模式中的死锁:
参考:REQ/REP
死锁 >>> https://dev59.com/Ppjga4cB1Zd3GeqPL4sW#38163015
图1:
为什么在所有情况下使用天真的
REQ/REP
是错误的
当
[1]
in_WaitToRecvSTATE_W2R
+
[2]
in_WaitToRecvSTATE_W2R
时,
REQ-FSA/REP-FSA
有严重的相互死锁问题,永远无法达到“下一个”
in_WaitToSendSTATE_W2S
内部状态。
XTRN_RISK_OF_FSA_DEADLOCKED ~ { NETWORK_LoS
: || NETWORK_LoM
: || SIG_KILL( App2 )
: || ...
: }
:
[App1] ![ZeroMQ] : [ZeroMQ] ![App2]
code-control! code-control : [code-control ! code-control
+===========!=======================+ : +=====================!===========+
| ! ZMQ | : | ZMQ ! |
| ! REQ-FSA | : | REP-FSA! |
| !+------+BUF> .connect()| v |.bind() +BUF>------+! |
| !|W2S |___|>tcp:>---------[*]-----(tcp:)--|___|W2R |! |
| .send()>-o--->|___| | | |___|-o---->.recv() |
| ___/ !| ^ | |___| | | |___| ^ | |! \___ |
| REQ !| | v |___| | | |___| | v |! REP |
| \___.recv()<----o-|___| | | |___|<---o-<.send()___/ |
| !| W2R|___| | | |___| W2S|! |
| !+------<BUF+ | | <BUF+------+! |
| ! | | ! |
| ! ZMQ | | ZMQ ! |
| ! REQ-FSA | | REP-FSA ! |
~~~~~~~~~~~~~ DEADLOCKED in W2R ~~~~~~~~ * ~~~~~~ DEADLOCKED in W2R ~~~~~~~~~~~~~
| ! /\/\/\/\/\/\/\/\/\/\/\| |/\/\/\/\/\/\/\/\/\/\/! |
| ! \/\/\/\/\/\/\/\/\/\/\/| |\/\/\/\/\/\/\/\/\/\/\! |
+===========!=======================+ +=====================!===========+
图2:
可以使用几个纯
ZeroMQ
内置工具来实现自由步进传输层,并添加一些 SIG 层工具以获取对所有可能的分布式系统状态的完全控制。
App1.PULL.recv(ZMQ.NOBLOCK)
和
App1.PULL.poll(0)
是显而易见的。
[App1] ![ZeroMQ]
code-control! code-control
+===========!=======================+
| ! |
| !+----------+ |
| .poll()| W2R ___|.bind() |
| ____.recv()<----o-|___|-(tcp:)--------O
| PULL !| |___| | :
| !| |___| | :
| !| |___| | :
| !+------<BUF+ | :
| ! | : ![App2]
| ! | : [ZeroMQ] ! code-control
| ! | : [code-control ! once gets started ...
| ! | : +=====================!===========+
| ! | : | ! |
| ! | : | +----------+! |
| ! | : | |___ |! |
| ! | : | |___| <--o-<.send()____ |
| ! | :<<-------<tcp:<|___| W2S|! PUSH |
| ! | : .connect() <BUF+------+! |
| ! | : | ! |
| ! | : | ! |
+===========!=======================+ : +=====================!===========+
Ad 2) 不可以,但是可以创建自己的“ZeroMQ可消费品”,以测试分布式系统设置新传输/信令套接字的能力,如果RTO测试未能证明(多个)双方准备好在ZeroMQ基础设施上进行设置和通信,则准备处理它并丢弃它(请注意,问题不仅在于ZeroMQ层,而且应用程序端可能没有准备好/处于这种状态来处理预期的通信交互(并可能导致软锁定/死锁)。
最好的下一步是什么?
我现在可以为您进一步的问题提供帮助,引导您查看有关该主题的更大画面 >>>,其中包含更多论点,一个简单的信令平面/消息平面说明和来自Pieter HINTJENS的必读书籍的直接链接。