zmq_socket类型解析

zmq_socket 这里缩写为ZS。

ZS的各个类型之间有的差异很小,而文档里面也没有详细解释这些名称是什么意思。

本文给出官方API文档中各种不同类型ZS的各个属性的解释,并罗列各个属性所有可能的值及其意义。

转载注明: http://blog.csdn.net/lqk1985/article/details/6650996

Compatible peer sockets

相容的,可以互连的ZS类型。

但是有两个没写全,ZMQ_REQ和ZMQ_REP的相容ZS类型,还包括ZMQ_DEALER和ZMQ_ROUTER。

Direction

此类型的ZS单向还是双向,就是是否支持发送数据、接收数据。

1.Unidirectional: 单向,只支持发送数据 或 只支持接收数据

2.Bidirectional: 双向,即可以发送数据又可以接收数据。

Send/receive pattern

是否支持发送数据、接收数据,或者接发方式有没有其他限制。

1.Send, Receive, Send, Receive, …: 先发送,后接收,必须按这个顺序。第一个必须是发送。不能出现连续两个发送或接收的。

2.Receive, Send, Receive, Send, … :先接收,后发送,必须按这个顺序。第一个必须是接收。不能出现连续两个发送或接收的。
send_multipart、recv_multipart 一般都是连续两个同类,这两者应该只算一次接受发送。
send_multipart还是自身能确定使用了SNDMORE;recv_multipart即对方用SNDMORE,自己可以使用 more = frontend.getsockopt(zmq.RCVMORE)来 判断。
这里不是很确定,ZMQ_ROUTER对应不同ZS时数据是经过封装的,一般会接受或发送(路由地址、空、数据)这么三个包。这样看来可能是只含一份数据的多个SNDMORE包才算一次。
但是封装也是人工的,你可以塞进去任意数据,并不一定符合既定的格式。这样看起来又是只要是SNDMORE发送多个包都应该算1个。
http://zguide.zeromq.org/cpp:lruqueue  backend发给 worker的格式是(worker,空,client地址,空,数据)

3.Unrestricted: 没有任何限制。既可以接收,也可以发送,顺序也没有要求。

4.Send only:只能发送数据。

5.Receive only:只能接收数据。

Incoming routing strategy

当有多个其他ZS连接本ZS时,接收其他ZS所发送的数据,所需要采用的路由策略。必须是Send/receive pattern中写明支持接收数据的。

1.Fair-queued: 参看 队列调度算法 。就是每次所有客户端挨个接收一次,每次只接收一个数据包。即如果A连续发了2个包,在第一轮遍历也只接收一个数据包。

2.N/A: 不支持接收数据,或者像ZMQ_PAIR这种只支持一个其他ZS连接本ZS的。

Outgoing routing strategy

当有多个其他ZS连接本ZS时,把数据发送给其他ZS,所需要采用的路由策略。必须是Send/receive pattern中写明支持发送数据的。

1. Load-balanced:负载均衡得将数据包分发给其他ZS。每个数据包只有一个ZS会收到。

2.Fan out:广播,将每个数据包分发给所有其他ZS。每个数据包所有相连的ZS都会收到。目前只有Pub是如此。

3.其他ZS连接到ZMQ_ROUTER时,要先指明id:socket.setsockopt(zmq.IDENTITY, identity)。

ZMQ_ROUTER发送时指定ZS的ID发送:socket.send(identity, zmq.SNDMORE) 。

ZMQ_HWM option action

缓冲池满了后的策略。

1.Block: 阻塞

2.Drop:不阻塞,直接忽略消息。 

3.N/A:只有PULL类型的是这样,不知其含义。

你可能感兴趣的:(MQ)