此文档指定了 ZeroMQ 请求应答模式的语义。覆盖了 REQ, REP, DEALER 和 ROUTER 套接字模式。此规范意图指导这些规范的实现以便于用户能够依赖这些可靠的语义。

原文地址: 28/REQREP

目标

该规范旨在正式记录 REQ、REP、DEALER 和 ROUTER 套接字类型的名称和预期行为,它们共同构成了 ZeroMQ 请求-应答模式。这些套接字的实现应遵循此规范,从而确保应用程序可以依赖于可预测的行为。此规范不是特定于传输的,并非所有行为都可以在所有传输上重现。

模式目标

请求-答复模式适用于各种面向服务的体系结构。它有两种基本风格:同步(REQ 和 REP)和异步(DEALER 和 ROUTER),它们可以以各种方式混合。DEALER 和 ROUTER 套接字是许多更高级别的协议(如 MDP)的构建块。

REQ 套接字

REQ 套接字类型充当一组匿名服务的客户端,使用锁步循环算法发送请求和接收回复。它专为简单的请求-回复模型而设计,对等点的可靠性不在考虑范围内。

一般行为:

  • 可以连接到任意数量的 REP/ROUTER 对等端。

  • 必须遵循发送一个消息-接受一个消息这种循环操作。

请求和回复的消息线上表示格式必须为:

  • 由一个空帧构成分节符。由 REQ 套接字添加。

  • 一个或多个数据帧。包含了对用户可见的消息。

处理传出消息时:

  • 必须由空帧构成的分界符作为前导。

  • 必须使用循环策略将传出消息发送到连接的对等方。

  • 阻塞发送,如果没有可发送的对等方,返回一个错误。

  • 不得丢弃无法发送到连接的对等方的消息。

处理传入消息时:

  • 只会接受它发送时的最后一个对等方的传入消息。

  • 会静默丢弃从其它对等放传入的消息。

REP 套接字

REP 套接字类型充当一组客户端对等体的服务,接收请求并将应答发送回请求对等体。它专为简单的远程过程调用模型而设计。

一般行为:

  • 可以连接到任意数量的 REQ 或 DEALER 对等体。

  • 不得以任何方式过滤或修改传出或传入消息。

  • 应一次只接收并发送一条消息。

请求和应答的线上表示应该采用下面的格式:

  • 由零个或多个帧构成的地址信封。每帧包含了一个标识。

  • 分隔符,由空帧组成。

  • 一个或多个数据帧,包含了对应用程序可见的消息。

对于传入消息:

  • 使用公平排队策略接受来自其对等方的传入消息。

  • 删除并储存地址信封,包括分隔符。

  • 将剩余的数据帧传递给应用程序。

对于传出信息:

  • 将会从它调用的应用程序等待单个响应消息。

  • 将会添加地址信封和分隔符。

  • 将会将此消息传递给原始对等端。

  • 如果原始对等端断开连接,则静默丢弃消息。

  • 发送时是非阻塞的。

DEALER 套接字

DEALER 套接字与一组匿名对等体通信,使用循环算法发送和接收消息。它是可靠的,因为它不会丢弃消息。DEALER 作为 REQ 的异步替代品,适用于与 REP 或 ROUTER 服务器通信的客户端。它也用于请求-回复代理。

一般行为:

  • 可以连接到任意数量的 REP 或 ROUTER 对等体,并且可以发送和接收消息。

  • 不得以任何方式过滤或修改传出或传入消息。

  • 为每个连接的对等体维护一个双队列,以允许传出消息和传入消息独立排队。

  • 在启动与对等体的传出连接时,应创建双队列,并且无论是否建立连接,都应保持双队列。

  • 当对等体连接到它时,应创建一个双队列。如果此对等体断开连接,则 DEALER 套接字应销毁其双队列并丢弃其包含的任何消息。

  • 传出队列和传入队列的大小应该是可动态配置的。

对于传出消息:

  • 仅当对等方的传出队列未满时,才应将该对等方视为可用。

  • 使用循环策略将传出消息路由到可用的对等方。

  • 当没有可用的对等节点时,应阻止发送或返回适当的错误。

  • 当没有可用的对等节点时,不应接受进一步的消息。

  • 不得丢弃无法排队的消息。

对于传入消息:

  • 将会使用公平排队策略接收来自其对等方的消息。

  • 应当将这些消息交付给应用程序。

ROUTER 套接字

ROUTER 套接字使用显式寻址与一组对等体通信,以便将每个传出消息发送到特定的对等体连接。ROUTER 作为 REP 的异步替代品,通常用作与 DEALER 客户端通信的服务器的基础。

一般行为:

  • 可以连接到任意数量的 REQ、DEALER 或 ROUTER 对等体,并且可以发送和接收消息。

  • 为每个连接的对等体维护一个双队列,允许传出和传入消息独立排队。

  • 在启动与对等体的传出连接时,应创建双队列,并且无论是否建立连接,都应保持双队列。

  • 当对等体连接到它时,应创建一个双队列。如果此对等体断开连接,则 ROUTER 套接字将销毁其双队列,并应丢弃其包含的任何消息。

  • 应使用唯一的“identity”二进制字符串标识每个双队列。

  • 应允许对等方通过 Identity 元数据属性显式指定它自己的标识。

  • 传出队列和传入队列的大小应该是可动态配置的。

对于传入消息:

  • 将会使用公平排队策略接收来自其对等方的消息。

  • 应当在每条传入消息前面加上一个包含原始双队列标识的帧。

  • 应当将这些消息交付给应用程序。

对于传出消息:

  • 应从每条传出消息中删除第一帧,并将其用作双队列的标识。

  • 如果传出队列存在并且有空间,则将消息路由到改队列。

  • 如果队列不存在或者已慢,则应以静默的方式删除消息,或者返回错误。取决于用户配置。

  • 发送是非阻塞的。

Last moify: 2024-02-01 04:31:02
Build time:2025-07-18 09:41:42
Powered By asphinx