ZeroMQ 消息模式簡介 ——java版

本介紹基於以下依賴

        <dependency>
            <groupId>org.zeromq</groupId>
            <artifactId>jeromq</artifactId>
            <version>0.5.1</version>
        </dependency>

參考文檔

ZMQ官方使用指南

ZMQ官方使用指南中文翻譯

ZMQ官方API文檔socket

ZMQ官方API文檔socketopt

ZMQsocketopt中文翻譯

jeromq的源碼

jeromq的javadoc

術語

high water mark: 高水位標誌,接收或發送消息的緩衝區大小可通過Socket::setRcvHWM和Socket::setSndHWM設置。(各種socket option的含義參考前面給的鏈接中的文檔)

mute state: 靜音狀態 ,一般是指某個端點無法發送消息的狀態,可能是因爲沒有與之連接的接收方,也可能是因爲接收方由於某些原因無法繼續接收消息。

消息模式

請求-回覆模式

請求回覆模式適用於客戶端向服務端發送請求,然後每一個請求都會收到服務端的回覆的場景。

ZMQ rfc/spec28

代碼樣例

https://gitee.com/toosimple-naive/zmq-learn/tree/dev/zmq/src/main/java/com/learn/zmq/repreq

包含的stocket type

ZMQ.REQ, ZMQ.REP, ZMQ.DEALER, ZMQ.ROUTER

ZMQ_REQ

ZMQ_REQ 類型的socket 用於向服務端發送請求並接收回復消息。

只能先發消息後收消息,發出的請求會以round-robin方式分配給不同的服務端節點。

沒有服務可用時,發送操作會阻塞,直到至少一個服務可用。

ZMQ_REQ 類型的socket不丟棄消息。

ZMQ_REQ 特徵
Compatible peer sockets ZMQ_REP, ZMQ_ROUTER
Direction Bidirectional
Send/receive pattern Send, Receive, Send, Receive, …
Outgoing routing strategy Round-robin
Incoming routing strategy Last peer
Action in mute state Block

ZMQ_REP

ZMQ_REP 類型的socket 用於接收請求併發送回復的服務。
只能先收消息後發消息。收到的消息以公平隊列的方式處理。
當請求方已不存在時,回覆消息會被丟棄。

ZMQ_REP 特徵
Compatible peer sockets ZMQ_REQ, ZMQ_DEALER
Direction Bidirectional
Send/receive pattern Receive, Send, Receive, Send, …
Incoming routing strategy Fair-queued
Outgoing routing strategy Last peer

ZMQ_DEALER

ZMQ_DEALER 類型的socket 是 request/reply sockets 的高級擴展。

所有發出的消息會以round robin的方式發送給連接端點。

連接端點全都達到high water mark時,或者沒有連接端點時,進入靜音狀態(mute state) 。

靜音狀態下發送操作會被阻塞。

ZMQ_DEALER socket 連接 到 ZMQ_REP 時,所有發出的消息必須包括:空消息(分隔),後續跟一個或多個body。

ZMQ_DEALER 特徵
Compatible peer sockets ZMQ_ROUTER, ZMQ_REP, ZMQ_DEALER
Direction Bidirectional
Send/receive pattern Unrestricted
Outgoing routing strategy Round-robin
Incoming routing strategy Fair-queued
Action in mute state Block

ZMQ_ROUTER

ZMQ_ROUTER 類型的socket 是 request/reply sockets 的高級擴展。

接收到消息後會添加一個包含源端點的identity的消息,然後再發送給應用程序。

發送消息時會先取出包含源端點identity的消息,以確定應該發送到哪一個端點。

沒有端點連接的時消息會被丟棄,除非調用Socket::setRouterMandatory設置ZMQ_ROUTER_MANDATORY爲1。

所有連接的端點都達到高水位標誌(high water mark)而無法接收消息時,會進入靜音狀態,此時丟棄所有發來的消息。

ZMQ_REQ 連接到ZMQ_ROUTER 時,ZMQ_ROUTER 收到的消息除了包含identity之外,還要包含空消息(分隔標誌)。

ZMQ_ROUTER 特徵
Compatible peer sockets ZMQ_DEALER, ZMQ_REQ, ZMQ_ROUTER
Direction Bidirectional
Send/receive pattern Unrestricted
Outgoing routing strategy See text
Incoming routing strategy Fair-queued
Action in mute state Drop

發佈-訂閱模式

發佈訂閱模式適用於一個發佈者向多個訂閱者發佈消息的場景。

ZMQ rfc/spec29

代碼樣例

https://gitee.com/toosimple-naive/zmq-learn/tree/dev/zmq/src/main/java/com/learn/zmq/pubsub

包含的stocket type

ZMQ.SUB, ZMQ.PUB, ZMQ.XSUB, ZMQ.XPUB

ZMQ_PUB

ZMQ_PUB 類型的socket用於發佈者分發數據。消息會被髮送給所有連接端點,該類型socket只能發送消息,不能接收消息。

ZMQ_PUB 類型的socket因爲一個訂閱者達到高水位標誌而進入靜音狀態時,所有發送給那個出問題的訂閱者的消息都會被丟棄,直到靜音狀態結束。
這種類型的socket的send方法永遠不應該阻塞。

ZMQ_PUB 特徵
Compatible peer sockets ZMQ_SUB, ZMQ_XSUB
Direction Unidirectional
Send/receive pattern Send only
Incoming routing strategy N/A
Outgoing routing strategy Fan out
Action in mute state Drop

ZMQ_SUB

ZMQ_SUB類型的socket用於向發佈者訂閱消息。Socket::subscribe方法進行訂閱。

ZMQ_SUB 特徵
Compatible peer sockets ZMQ_PUB, ZMQ_XPUB
Direction Unidirectional
Send/receive pattern Receive only
Incoming routing strategy Fair-queued
Outgoing routing strategy N/A

ZMQ_XPUB

ZMQ_XPUB類型的socket和ZMQ_PUB類型的socket功能基本一致,除了可以消息方式接受訂閱。一個訂閱消息,以字節1(訂閱)或者字節0(取消訂閱)開頭,後接訂閱body。沒有前綴的消息也會被接收,但是對訂閱狀態沒有影響。

ZMQ_XPUB 特徵
Compatible peer sockets ZMQ_SUB, ZMQ_XSUB
Direction Unidirectional
Send/receive pattern Send messages, receive subscriptions
Incoming routing strategy N/A
Outgoing routing strategy Fan out
Action in mute state Drop

ZMQ_XSUB

ZMQ_XSUB 類型的socket和ZMQ_SUB類型的socket功能基本一致,除了以發出消息的方式進行訂閱。一個訂閱消息,以字節1(訂閱)或者字節0(取消訂閱)開頭,後接訂閱body。沒有前綴的消息也可以被髮出,但是對訂閱狀態沒有影響。

ZMQ_XSUB 特徵
Compatible peer sockets ZMQ_PUB, ZMQ_XPUB
Direction Unidirectional
Send/receive pattern Receive messages, send subscriptions
Incoming routing strategy Fair-queued
Outgoing routing strategy N/A
Action in mute state Drop

管道模式

管道模式適用於向組織在一個管道中的所有節點發布數據的場景。管道的每一段都連接到至少一個節點,並且當有多個節點連接到同一個管道時,數據是以round-robin方式發送給這些節點的。

ZMQ rfc/spec30

代碼樣例

https://gitee.com/toosimple-naive/zmq-learn/tree/dev/zmq/src/main/java/com/learn/zmq/pipeline

包含的stocket type

ZMQ.PUSH, ZMQ.PULL

ZMQ_PUSH

ZMQ_PUSH 類型的socket用於從一個管道節點向下遊管道節點發送消息。消息會以round-robin的方式發送給所有連接到該節點的下游節點。這種類型的socket不能接收消息,只能發送消息。

ZMQ_PUSH 類型的socket因爲所有下游節點達到高水位標誌時,或者沒有下游節點,而進入靜音狀態時,所有的發送操作都會阻塞,直到有下游節點可接收消息時。消息不會被丟棄。

ZMQ_PUSH 特徵
Compatible peer sockets ZMQ_PULL
Direction Unidirectional
Send/receive pattern Send only
Incoming routing strategy N/A
Outgoing routing strategy Round-robin
Action in mute state Block

ZMQ_PULL

ZMQ_PULL類型的socket用於接收所有上游管道節點向下遊管道節點發送的消息。消息會以fair-queue的方式被接收 。這種類型的socket只能接收消息,不能發送消息。

ZMQ_PULL 特徵
Compatible peer sockets ZMQ_PUSH
Direction Unidirectional
Send/receive pattern Receive only
Incoming routing strategy Fair-queued
Outgoing routing strategy N/A
Action in mute state Block

排他結對模式

排他結對模式適用於要實現精確的端到端連接的場景。

ZMQ rfc/spec31

代碼樣例

https://gitee.com/toosimple-naive/zmq-learn/tree/dev/zmq/src/main/java/com/learn/zmq/pair

包含的stocket type

ZMQ.PAIR

ZMQ_PAIR

ZMQ_PAIR類型的socket每次只能和一個ZMQ_PAIR類型的socket相連接。通過該類型的socket發送的消息,不會進行路由或過濾(因爲沒有必要)

ZMQ_PAIR類型的socket因爲和它相連接的端點達到高水位標誌時,或者沒有端點和它連接,而進入靜音狀態,所有發送操作都會阻塞,直到有可以接收的端點。消息不會被丟棄。

ZMQ_PAIR 特徵
Compatible peer sockets ZMQ_PAIR
Direction Bidirectional
Send/receive pattern Unrestricted
Incoming routing strategy N/A
Outgoing routing strategy N/A
Action in mute state Block

原生模式

原生模式適用於和TCP端點通信的場景,允許雙向的異步請求和回覆。

代碼樣例

https://gitee.com/toosimple-naive/zmq-learn/tree/dev/zmq/src/main/java/com/learn/zmq/stream

包含的stocket type

ZMQ.STREAM

ZMQ_STREAM

ZMQ_STREAM類型的socket一般用於和非zmq的端點進行交互。當使用tcp協議通信時,該類型的socket可以作爲客戶端或者服務端,異步發送或接收數據。

接收TCP數據時,ZMQ_STREAM類型的socket會補充一個包含源端點identity的消息,多個端點同時發送給該類型socket的消息被以fair-queue的方式接收。

發送TCP數據時,ZMQ_STREAM類型的socket會移除包含identity的消息,並利用這個identity確定消息發送的目標端點。

所以發送消息前必須先發一個identity frame ,跟着一個實際消息的frame。

斷開連接需要先發送一個identity消息frame,跟着一個空消息frame。

ZMQ_STREAM類型的服務端點發送消息時必須使用ZMQ.SNDMORE標誌,否則無法繼續向其他連接端點發送消息。

ZMQ_STREAM 特徵
Compatible peer sockets none.
Direction Bidirectional
Send/receive pattern Unrestricted
Outgoing routing strategy See text
Incoming routing strategy Fair-queued
Action in mute state EAGAIN
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章