1. NATS: 自适应边缘和分布式系统 的连接技术

nats可以做什么:

负责寻址,发现和交换消息,这些消息提供给分布式系统,用来驱动常见的模式:询问和回答(微服务)、创建和处理(增删改)、流处理(消息加工)

为什么需要NATS技术:

随着微服务、功能函数和流处理被要求转移到边缘,现有(用于连接移动前端和静态后端的1:1通信模式,如HTTPorGRPC)技术受到了挑战。

NATS连接技术的特性:

  1. M:N连接:NATS根据主题而不是主机名和端口来管理寻址和发现。

  2. 在任何地方部署安全混合部署

  3. 可扩展的部署:NATS基础设施和客户端实时沟通所有拓扑变化。即当NATS部署发生变化时,NATS客户端不需要改变

  4. 适应性:nats支持更多组件的利用和更多数据的处理。nats支持M:N的通信模式。nats提供的寻址和发现功能与DNS所绑定。以上特性决定了nats对新系统和新需求的适应性。

2. 什么是NATS:面向消息的中间件

nats用来做什么:

  1. 构建分布式和可拓展的C/S应用;

  2. 一般方式实时存储和分发数据。(兼容各自环境和语言)

NATS 服务基础设施是什么?

NATS 服务由一个或多个 NATS 服务器进程提供,这些进程配置相互互连,提供NATS 服务基础架构。(集群,具有可拓展性)

NATS 客户端如何连接到 NATS 服务器?

  1. URL: 一个 'NATS URL'。这是一个字符串(以 URL 格式),指定可以访问 NATS 服务器的 IP 地址和端口,以及要建立的连接类型(普通 TCP、TLS 或 Websocket)。

  2. 认证(如需登录):认证 前端传来的信息,用于向 NATS 服务器标识自己。 NATS 支持多种身份验证方案(用户名/密码、去中心化 JWT、令牌、TLS 证书和带挑战的 Nkey)。

NATS是如何设计消息传递的?

  1. 发布者:对数据进行编码、框架化为消息,最后发出。

  2. 消息的寻址和标识过程:依赖主题字符串,而非网络位置(域名,IP,Port)。

  3. 订阅者:接收消息,解码并处理消息。

该设计的好处

  1. 各程序可共享通用的消息处理代码(复用)
  2. 各程序之间隔离了资源和相互依赖关系(解耦)
  3. 可通过增加消息处理方法进行扩展。

3. 基于主题的消息传递

主题

是形成名称(用于查找对象)的字符串。建议使用ASCII字符。NATS的发布和监听消息严重依赖_Subjects_。

主题层次结构

主题字串的通配符

  1. 匹配单个标记:第一个通配符是 *,它将匹配单个标记。(可在同一主题重复出现)

  1. 匹配多个标记:第二个通配符是>,它将匹配一个或多个标记,并且只能出现在主题的末尾。(分接头:为 > 创建一个订阅者,可监控NATS集群上的所有消息)

4. 核心NATS

核心NATS是什么?

核心NATS是NATS服务基础设施提供的基本功能和服务质量(QoS)集。其功能是发布/订阅,具有基于主题的寻址和队列,以及“最多一次”服务质量。(不包括nats-server启用JetStream后提供的功能和服务)

1、发布和订阅

NATS如何发布和订阅?

NATS实现了1:N通信的消息分发模型。在此模型中,订阅者从特定主题中持续监听消息,而发布者随时向特定主题发送消息。订阅者可以通过主题字串通配符 注册一系列的主题(即监听多个群聊)。此1:N的通信模式可被称为分发

NATS的消息组成:

  1. 主题
  2. 以二进制数组形式载荷的内容
  3. 头部header
  4. 可选项:回复地址

消息的默认最大载荷为1M,可自行增加至64M

分布式系统中的请求-响应模式:

即,进程发送请求后,或是以异步方式接收响应,或是超时等待。

此模式需要具备以下特性:位置透明性,可扩展性,可观测性。

2、请求和响应

NATS如何实现请求-响应模式?

  • 使用NATS内核的通信机制:发布-订阅。订阅者随时用自己的收件箱 将请求发送到特定主题中。持续监听特定主题的发布者用发来的收件箱将响应回复给订阅者。
  • 多个NATS响应者会自动地形成动态队列组。因此,手动去添加或移除订阅者,影响不了响应者队列对消息的发送行为。
  • NATS程序在连接断开前会排空缓冲,以减小进程规模。
  • 基于发布-订阅机制,NATS程序可以查看请求和响应,以测量延迟、监视异常、直接可扩展性等。
  • NATS允许多个响应者,其中第一个送达的响应被利用,额外的响应被丢弃。这可以减少响应的延迟和抖动

无响应者的情况:

当请求被发送到一个没有订阅者的主题时,如果客户端设置了消息的可选项:no_responder messages ,那么则会立刻收到一个状态码为503,没有body的回复。