如何保护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#中触发事件。

如何保护ZeroMQ请求回复模式免受潜在的消息丢失

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