初探ZeroMQ(二) 请求-应答模式中套结字总结

参考资料:ØMQ - The Guide(英文)
参考资料:ØMQ - The Guide(中文)
本文主要介绍和总结在请求-应答模式中各种套结字的行为.


套结字简介

来点通俗易懂的,先认识下请求-应答模式的套结字:
REQ: 它严格执行<发送-接收-发送-….>步骤,妥妥的”同步”过程,阻塞是常用的事儿,因为没有收到回复,它是不能再次发送消息的.顺便发消息的时候给消息加个空结构(分界符).
REP: 它严格执行<接收-发送-接收-….>步骤,同REQ一样,它也是同步的.接收消息的时候顺手把所有信封剥下来,等发送消息的时候再把信封粘上去.
ROUTER: 这玩意儿想收多少消息就收多少,想发多少消息就发多少,这就是任性的异步.顺便还在收到的消息中添加消息的来源(信封),不管消息走多远,都能返回家里.
DEALER: 同ROUTER一样,但不在收到的消息中添加消息的来源.任性的收消息和发消息就是了.


以下是译文,原文地址:http://rfc.zeromq.org/spec:28

请求 - 应答模式

请求 - 应答模式适用于各种面向服务的架构。它有两种基本形式:同步(REQ和REP)和异步(DEALER和ROUTER),其可以以各种方式混合。DEALER和ROUTER套接字构建了许多更高级别的协议块,例如 Majordomo Protocol.

REQ 套结字类型

将REQ套接字类型作为一组匿名服务的客户端,发送请求和使用一个锁步轮询算法接收答复。它是专为简单的请求 - 应答模型涉及的,它并不关心失败的远端连接引起的可靠性问题。

常规行为:

-可以连接到任意数量的REP或ROUTER远端。
-将在发送一个消息后,马上准备接收一个消息。

请求和应答消息在传输时的格式 :

-由REQ套结字添加一个分界符,该分界赋是一个空的结构 
-至少一个含有数据的结构, 这些数据是对应用程序可见的.

处理传出的消息:

-将会给发出的消息的前面添加一个空的分界符结构
-将会采用轮询的策略来路由传出的信息给与已经建立的远端连接
-在没有连接时,进会阻塞在发送上,或者返回一个合适的error
-将不会丢弃它不能发送的信息

处理传入的消息:

-将只会从最后一个发出请求的连接那里接收消息
-将会默默的丢弃从其他连接那里接收到的消息

REP套结字类型

REP套接字类型充当一组客户端的服务,接收请求和发送应答给客户端。它是专为简单的远程过程调用模型设计的.

常规行为:

-可以连接到任意数量的REQ或DEALER远端
-不会过滤或修改以任何方式传出或传入的消息
-将会在收到一个消息后,马上发送一个消息.

请求和应答消息在传输时的格式 :

-由至少0个结构组成的地址信封,每个结构都包含一个连接的身份信息
-一个分界符,该分界赋是一个空的结构  
-至少一个含有数据的结构, 这些数据是对应用程序可见的.

处理传入的消息:

-将使用公平队列策略从多个连接中接收消息
-将会剥离并存储地址信封,包括分界赋
-将先应用程序传入被剥离后的所有消息结构.

处理传出的消息:

-将等待来自应用程序的回复消息.
-将会给传出的信息的前面加上被剥离的地址信息和分界赋
-将会发送回复消息给发来请求的连接
-如果远端连接断开了连接,将会默默的丢弃信息,或者返回一个错误
-将不会阻塞在发送上.

DEALER 套结字类型

DEALER套接字类型跟一组匿名的连接通信,使用轮询算法发送和接收消息。它是可靠的,因为它不下降消息。对于跟REP或ROUTER的服务器通信的客户端,DEALER可以作为一个异步的方法来替代REQ。它也可用于在请求 - 应答模式的代理中。

常规行为:

-可以连接任意数量的REP或ROUTER远端连接,既可以发送消息,也可以接收消息
-不会过滤或修改以任何方式传出或传入的消息
-将包含两个队列(传入/传出队列)给每个连接,允许传入传出数据独立的排队
-将在启动一个传出连接的时候创建两个队列,不管连接是否建立,它都包含则两个队列
-将在新连接到来时创建两个队列.如果断开连接,DEALER套结字将会摧毁这两个队列,并且丢弃队列中包含的消息.
-应该限制运行时传入传出队列的大小

处理传出数据:

-仅当连接的传出队列未满时,才认为该连接可用
-将采用轮询的策略去路由传出的消息给可用的连接
-当它没有可用的连接时,将阻塞在发送上,或者返回一个合适的error.
-当它没有可用的连接时,进不会接收进一步的消息.
-将不会丢弃它不能排队的消息.

处理传入数据:

-将会采用公平队列策略接收消息.
-将会传递消息给应用程序.

ROUTER 套结字

ROUTER 套结字通过显示的地址来连接一组远端连接,使用显示连接的目的是为了传出消息路由,ROUTER 作为 REP 的异步替代方法, 经常被服务器用来更DEALER客户端交流.

常规行为:

-可以被任意数量的REQ,DEALER,ROUTER的远端连接,既可以发送消息,也可以接收消息
-将包含两个队列(传入/传出队列)给每个连接,允许传入传出数据独立的排队
-将在启动一个传出连接的时候创建两个队列,不管连接是否建立,它都包含则两个队列
-将在新连接到来时创建两个队列.如果断开连接,DEALER套结字将会摧毁这两个队列,并且丢弃队列中包含的消息.
-将会通过"identity"二进制字符串来标识每个连接的输入输出队列
-应该允许远端连接通过Identity元属性来显示的分配它自己的identity
-应该限制运行时传入传出队列的大小

处理传入数据:

-将会采用公平队列策略接收消息.
-将会给收到的消息的前面添加一个结构,该结构含有收发队列的identity
-将会把添加了identity的消息传递给应用程序.

处理传出数据:

-将会移除传出数据的第一个结构,并用该结构(即identity)来查找收发队列,一个收发队列代表了一个远端连接
-如果传出队列存在,并且拥有空间,将会路由传出数据给传出队列
-如果传出队列不存在,或者传出队列已满,将根据配置信息,决定是默默的丢弃信息还是返回错误
-将不会阻塞在消息发送上.

你可能感兴趣的:(C++)