本介紹基於以下依賴
<dependency>
<groupId>org.zeromq</groupId>
<artifactId>jeromq</artifactId>
<version>0.5.1</version>
</dependency>
參考文檔
術語
high water mark: 高水位標誌,接收或發送消息的緩衝區大小可通過Socket::setRcvHWM和Socket::setSndHWM設置。(各種socket option的含義參考前面給的鏈接中的文檔)
mute state: 靜音狀態 ,一般是指某個端點無法發送消息的狀態,可能是因爲沒有與之連接的接收方,也可能是因爲接收方由於某些原因無法繼續接收消息。
消息模式
請求-回覆模式
請求回覆模式適用於客戶端向服務端發送請求,然後每一個請求都會收到服務端的回覆的場景。
代碼樣例
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 |
發佈-訂閱模式
發佈訂閱模式適用於一個發佈者向多個訂閱者發佈消息的場景。
代碼樣例
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方式發送給這些節點的。
代碼樣例
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 |
排他結對模式
排他結對模式適用於要實現精確的端到端連接的場景。
代碼樣例
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 |