如何保护ZeroMQ请求回复模式免受潜在的消息丢失
本文关键字:消息 模式 回复 何保护 保护 请求 ZeroMQ | 更新日期: 2023-09-27 18:16:15
我正试图在c#应用程序和分布式python服务器之间的TCP层上实现ZeroMQ模式。我已经得到了一个版本的工作与请求-应答 REQ/REP
模式,它似乎相对稳定时,测试 localhost
。然而,在测试中,我调试了一些情况,在收到显然不可接受的回复之前,我意外地发送了多个请求。
在实践中,网络可能会有很多丢失的数据包,我怀疑我会丢失很多回复和/或无法发送请求。
1)是否有办法重置REQ/REP
请求-应答套接字之间的连接?
REOUTER/DEALER
模式会更有意义吗?由于这是我使用ZeroMQ的第一个应用程序,我希望保持简单。
2)是否有一个好的ZeroMQ机制来处理连接事件?我一直在阅读"指南",其中有一些提到监视连接,但没有示例。我找到了 ZMonitor
,但无法在c#中触发事件。
Ad 1)没有,
在ZeroMQ框架中没有任何套接字链路管理接口暴露给用户来测试/重置fsa到fsa链路的状态。
是的, XREQ/XREP
可以帮助您克服死锁,这可能&发生在REQ/REP
可伸缩的正式通信模式:
Ref。:
REQ/REP
Deadlocks>> https://stackoverflow.com/a/38163015/3666197
Fig.1:
当[1]
in_WaitToRecvSTATE_W2R
+ [2]
in_WaitToRecvSTATE_W2R
基本上是REQ-FSA/REP-FSA
有限状态自动机不可挽回的相互死锁,并且永远不会达到"下" in_WaitToSendSTATE_W2S
内部状态时,为什么使用朴素的 REQ/REP
是错误的?
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+------+! |
| ! | : | ! |
| ! | : | ! |
+===========!=======================+ : +=====================!===========+
Ad 2)没有,
但是可以创建自己的"ZeroMQ消耗品"来测试分布式系统设置新的传输/信令套接字的能力,准备处置它,如果rto测试未能证明双方(多个)都准备在ZeroMQ基础设施上设置+通信(注意,问题不仅与ZeroMQ层,而且应用端也不需要准备好/处于这种状态来处理预期的通信交互(并且可能导致软锁/死锁)。
最好的下一步是什么?
我现在能做的就是引导你看到这个主题的更大的画面>>与更多的参数,一个简单的信号平面/消息平面插图和一个直接链接到必读的书从Pieter HINTJENS