47/客户端服务器

47/客户端服务器

ZeroMQ 客户端-服务器

本文档规定了 ZeroMQ 客户端-服务器模式的语义,该模式涵盖 CLIENT 和 SERVER 套接字类型。本规范旨在指导这些套接字类型的实现,以便用户可以依赖可靠的语义。

前言

版权所有 (c) 2020 Doron Somech

本规范是自由软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证(版本 3 或您选择的任何更高版本)的条款重新分发和/或修改它。分发本规范是希望它会有用,但**不提供任何保证**;甚至不包括适销性或适用于特定用途的默示担保。有关更多详情,请参阅 GNU 通用公共许可证。您应该已经随本程序一起收到了 GNU 通用公共许可证的副本;如果没有,请参阅 https://gnu.ac.cn/licenses

本规范是自由开放标准,并遵循数字标准组织 (Digital Standards Organization) 的面向共识的规范系统 (Consensus-Oriented Specification System)

本文档中的关键词“MUST”(必须)、“MUST NOT”(不得)、“REQUIRED”(要求)、“SHALL”(应)、“SHALL NOT”(不应)、“SHOULD”(应该)、“SHOULD NOT”(不应该)、“RECOMMENDED”(建议)、“MAY”(可以)和“OPTIONAL”(可选)应根据 RFC 2119 中的描述进行解释。

目标

本规范旨在正式记录 CLIENT 和 SERVER 套接字类型的名称及预期行为。这些套接字的兼容实现**应该**遵守本规范,从而确保应用程序可以依赖可预测的行为。本规范不特定于传输方式,但并非所有行为都能在所有传输方式上重现。

本模式的总体目标

客户端-服务器模式是一个新的线程安全套接字家族的成员。客户端-服务器模式是 ROUTER-DEALER 模式的线程安全替代方案。客户端-服务器模式旨在用于各种面向服务的体系结构,并且是异步的(类似于 ROUTER-DEALER 模式)。

为了使 API 线程安全,发送和接收消息**必须**是原子性的,并且通过单个 API 调用来接收或发送整个消息。因此,客户端-服务器模式(以及线程安全家族的其余成员)**不得**允许多部分消息。

CLIENT 套接字类型

CLIENT 套接字类型与一组匿名对等方通信,使用轮询算法发送和接收消息。它在不丢弃消息的范围内是可靠的。

一般行为

  • **可以**连接到任意数量的 SERVER 对等方,并且**可以**发送和接收消息。
  • **不应**以任何方式过滤或修改出站或入站消息。
  • **应**为每个连接的对等方维护一个双队列,允许出站和入站消息独立排队。
  • **应**在发起与对等方的出站连接时创建一个双队列,无论连接是否建立,都**应**维护该双队列。
  • **应**在对等方连接到它时创建一个双队列。如果此对等方断开连接,CLIENT 套接字**应**销毁其双队列并**应**丢弃其中包含的任何消息。
  • **应该**将入站和出站队列的大小限制在运行时可配置的阈值内。
  • **必须**是线程安全的,并允许从多个线程进行接收和发送。

处理出站消息

  • **应**仅在其出站队列未满时才将对等方视为可用。
  • **应**使用轮询策略将出站消息路由到可用的对等方。
  • **应**在没有可用对等方时阻塞发送,或返回适当的错误。
  • **不应**丢弃无法加入队列的消息。
  • **不得**发送多部分消息。

处理入站消息

  • **应**使用公平排队策略从其对等方接收入站消息。
  • **应**将这些消息传递给其调用应用程序。
  • **必须**丢弃多部分消息的任何部分,**可以**断开发送多部分消息的对等方。

SERVER 套接字类型

SERVER 套接字类型与一组对等方通信,使用显式路由 ID 将每条出站消息发送到特定的对等方连接。

一般行为

  • **可以**连接到任意数量的 CLIENT 对等方,并且**可以**发送和接收消息。
  • **应**为每个连接的对等方维护一个双队列,允许出站和入站消息独立排队。
  • **应**在发起与对等方的出站连接时创建一个双队列,无论连接是否建立,都**应**维护该双队列。
  • **应**在对等方连接到它时创建一个双队列。如果此对等方断开连接,SERVER 套接字**应**销毁其双队列并**应**丢弃其中包含的任何消息。
  • **应**为每个双队列分配一个路由 ID。
  • 路由 ID **应**为 4 字节整数。
  • **不应**允许对等方显式指定其路由 ID。
  • **应该**将入站和出站队列的大小限制在运行时可配置的阈值内。

处理入站消息

  • **应**使用公平排队策略从其对等方接收入站消息。
  • **应**将双队列的路由 ID 附加到消息中。
  • **应**将产生的消息传递给其调用应用程序。
  • **必须**丢弃多部分消息的任何部分,**可以**断开发送多部分消息的对等方。

处理出站消息

  • **应**从每条出站消息中移除第一帧,并将其用作双队列的标识。
  • **应**将消息路由到出站队列(如果该队列存在且有空间)。
  • 如果队列不存在或已满,**应**根据配置选择静默丢弃消息或返回错误。
  • **不应**阻塞发送。
  • **不得**发送多部分消息。

安全方面

本规范不涉及安全方面。