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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章