我尝试在 c#应用程序和分布式 python 服务器之间的TCP层上实现 ZeroMQ 模式。我已经找到了使用请求 - 回复 REQ/REP
模式的版本,并且在 localhost
上进行测试时似乎相对稳定。但是,在测试中,我调试了一些情况,我在收到回复之前意外发送了多个请求,这显然是不可接受的。
在实践中,网络可能会丢失大量数据包,我怀疑我会丢弃大量回复和/或无法发送请求。
1)有没有办法重置REQ/REP
请求 - 回复套接字之间的连接?
REOUTER/DEALER
模式会不会反而更有道理?由于这是我第一次使用ZeroMQ,我希望保持简单。
2)是否有一个良好的ZeroMQ机制来处理连接事件?我一直在阅读"指南"并且有一些提到监控连接,但没有例子。我找到了 ZMonitor
,但无法在c#中触发事件。
答案 0 :(得分:5)
广告1)否,
没有任何套接字链接管理接口向用户公开,以测试/重置ZeroMQ框架中FSA到FSA链接的状态。 / p>
是的, XREQ/XREP
可以帮助您克服僵局,这可能是&在REQ/REP
可扩展的正式通信模式中发生:
参考:
REQ/REP
死锁>>> https://stackoverflow.com/a/38163015/3666197
Fig.1:
为什么在REQ/REP
时使用天真的 [1]
所有情况都是错误的in_WaitToRecvSTATE_W2R
+ [2]
in_WaitToRecvSTATE_W2R
主要是REQ-FSA/REP-FSA
有限状态自动机的不可解决的相互僵局,永远不会到达" next" 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 ~~~~~~~~~~~~~
| ! /\/\/\/\/\/\/\/\/\/\/\| |/\/\/\/\/\/\/\/\/\/\/! |
| ! \/\/\/\/\/\/\/\/\/\/\/| |\/\/\/\/\/\/\/\/\/\/\! |
+===========!=======================+ +=====================!===========+
Fig.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+------+! |
| ! | : | ! |
| ! | : | ! |
+===========!=======================+ : +=====================!===========+
广告2)否,但是可以创建自己的&#34; ZeroMQ耗材&#34; 来测试分发系统能够设置新的传输/信令插座,准备好处理它,如果RTO测试无法证明两个(多个)端都准备好建立+通过ZeroMQ基础设施进行通信(注意,问题不仅在于ZeroMQ层,而且App端也不需要准备好/处于这种状态以处理预期的通信交互(并且可能导致软锁/死锁)。
What I can do for your further questions right now is to direct you to see a bigger picture on this subject >>>,一个简单的信号平面/消息传递平面插图和一个指向必读书籍的直接链接< / strong>来自Pieter HINTJENS。