ZeroMQ接口API解读(1) zmq_socket()

zmq_socket()

描述

本函数返回一个void*类型的句柄,用于引用这个socket,type参数则决定了该socket上消息队列的类型。

新建的socket是未绑定的,要使socket能够通讯,必须调用zmq_connect()与另一个端点建立连接或者调用zmq_bind()使其能够接受来自其它端点的连接。

传统的网络socket代表同步接口,而zmq socket则代表异步消息队列接口。网络socket传输子节流或数据报,zmq socket传输消息。

zmq的异步含义是连接建立和销毁,消息传输的时序都是由zmq自己完成的,与用户无关。如果对方无法接收,则发送端会将消息排序放入队列,而不是丢弃。

传统socket只允许一对一或多对一,但zmq socket允许发起多个连接,也允许多个端点连接自己,从而可以建立多对多的关系。

socket类型

socket类型是按照消息通讯模式来划分的。

请求-响应模式

本模式用于一个客户端向某个服务的一个或多个实例发起请求,并接收来自服务器的对每个请求的响应。

ZMQ_REQ

ZMQ_REQ socket用于客户端向服务器发送请求和接收来自服务答复此套接字类型只允许一个zmq_send(请求)随后zmq_recv答复交替调用。如果有多个服务实例,则每个客户端请求发送和多个服务实例之间用轮转调度,每个收到的答复与最近发出请求匹配

ZMQ_REQ socket连接的所有服务实例都进入高水位状态,或者当前没有服务实例可用,那么这个socket就进入异常状态,这个socket上所有的zmq_send()操作将会阻塞(放入队列但是不发送),直到异常状态结束或有可用的服务实例。消息不会被丢弃。


ZMQ_REQ socket特性
对方socket类型 ZMQ_REP
方向 双向
发送/接收模式 Send, Receive, Send, Receive, …
发送调度策略 Round-robin
到达路由策略 Last peer
高水位处理 阻塞

ZMQ_REP

ZMQ_REP socket是服务实例用于从客户端接收请求和向客户端发送响应的。这种socket类型只允许zmq_recv()和zmq_send()交替调用。每个接受到的请求是按照所有客户端内公平原则排队的。每个响应都会发送给最近一个发起请求的客户端。如果原始的请求客户端不存在,那么响应被丢弃。

当ZMQ_REP socket由于客户端的高水位原因进入异常状态时,所有发送到客户端的响应都会被丢弃,直到异常结束。

ZMQ_REP socket特性
对方socket类型 ZMQ_REQ
方向 双向
发送/接收模式 Receive, Send, Receive, Send, …
接收调度策略 Fair-queued
发送路由策略 Last peer
高水位处理 丢弃

ZMQ_DEALER

本类型的socket是一种用于扩展请求/响应模式的高级模式。每个消息按照round-robine方式发送,按照fair-queue方式接收。

当所有客户端都进入高水位状态或不存在客户端时,本socket进入异常状态。这时本socket上的任何zmq_send()调用都将阻塞,直到异常情况结束。消息不会丢弃。

When a ZMQ_DEALER socket is connected to a ZMQ_REP socket each message sent must consist of an empty message part, the delimiter, followed by one or more body parts.

当一个ZMQ_DEALER socket连接到一个ZMQ_REP socket时,每个发送的消息都必须由一个空消息,分隔符和一个或多个消息体组成。

ZMQ_DEALER特性
对端socket类型 ZMQ_ROUTER, ZMQ_REQ, ZMQ_REP
方向 双向
发送/接收模式 不限
发送策略 Round-robin
接收策略 Fair-queued
高水位处理 阻塞

ZMQ_ROUTER

本类型的socket是一种用于扩展请求/响应模式的高级模式。当接收消息时,在将消息传递给下一个环节时, ZMQ_ROUTER socket在消息的前面追加一个包含发送方标识的字段。 每个消息按照fair-queue方式接收。当发送消息时, ZMQ_ROUTER socket将移除消息的第一个部分,并用它决定消息要发送的目的地。如果目的地不存在,则消息被丢弃。

ZMQ_ROUTER socket达到高水位时,它将进入异常状态,这时所有发到这个socket的消息将被丢弃。同样,路由到一个不存在的对端或对端已经达到高水位时,消息将被丢弃。

当一个ZMQ_REQ连接到一个ZMQ_ROUTER socket时,每个收到的消息必须包含发送端的标识和一个分隔符。因此,收到的消息的结构是:一个或多个标识,分隔符,一个或多个消息体。当发送响应给ZMQ_REQ socket时,应用程序必须包含分隔符。

ZMQ_ROUTER特性
对端socket ZMQ_DEALER, ZMQ_REQ, ZMQ_REP
方向 双向
发送/接收模式 不限
发送策略 See text
接收策略 Fair-queued
高水位处理 丢弃

你可能感兴趣的:(ZeroMQ,消息队列)