Item 3 : using pure ZeroMQ built-in modules
Fig.1: Why the naive REQ/REP misused
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: How to implement Item 3 requirement using pure ZeroMQ built-in functions.
App1.PULL.recv( ZMQ.NOBLOCK ) and App1.PULL.poll( 0 ) obvious
[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+------+! | | ! | : | ! | | ! | : | ! | +===========!=======================+ : +=====================!===========+
source share