Nats设计与实现
February 26, 2024
NATS设计与实现 #
NATS 就是一个消息中间件,提供了 Pub/Sub 核心数据流,并基于此构建了 Request/Reply API 和 JetStream 用来提供可靠的分布式存储能力,和更高的 QoS(至少一次 + ACK)。
1. 核心概念 #
序号 | 名词(ENG) | 名词(zh-CN) | 解释 |
---|---|---|---|
1 | Publish | 发布 | 发布动作,往 subject 中投递一条消息 |
2 | Subscribe | 订阅 | 订阅动作,表示想要接受发布相应 subject 的消息 |
3 | Subject | 主题 | 唯一标识,用于标识一种或者一类事件的概念。订阅时,可以使用 nats 约定的通匹配符来接收一类 subjects,如 orders.> 。 |
4 | Core Nats | NATS 核心 | CORE NATS 提供了以下能力: - PUB / SUB https://docs.nats.io/nats-concepts/core-nats/pubsub - Request / Reply https://docs.nats.io/nats-concepts/core-nats/reqreply - Queue Groups https://docs.nats.io/nats-concepts/core-nats/queue 提供 最多一次 的消息传递保证 |
5 | Request / Reply | 请求 / 回复 | NATS 基于 PUB / SUB 实现的对 request 异步回复的功能,依赖于消息中的 reply 字段。reply 是内置实现,随机生成一个 “inbox” subject。 订阅者中间也是存在 Queue Group 概念的。 注意:发起 request 如果没有reply,那么服务端会返回 No Responders 消息。 |
6 | Queue groups | 队列组 | 订阅者使用同一个队列名称,它们就会成为一个队列组。每次队列组接收到消息时,只有队列组中_随机选择_的一个订阅者会消费一条消息,内置的负载均衡。 |
7 | Message | 消息 or 事件 | 一条消息包含了以下内容: - Subject. - A payload in the form of a byte array. - Any number of header fields. - An optional ‘reply’ address field. |
8 | Subject wildcards https://docs.nats.io/nats-concepts/subjects#wildcards |
主题通配符 | 订阅者可以使用这些通配符_通过单个订阅收听多个主题。_ 注意:但发布者将始终使用完全指定的主题,而不使用通配符。 |
9 | JetStream https://docs.nats.io/nats-concepts/jetstream |
无 / 流 | NATS 中一个功能特性,它是一个内置的分布式存储,在 CORE nats 的基础上扩展了更多的功能和更高的 QoS。功能上: - Stream:将 NATS 消息存储在流中,提供多种保留策略、限制、丢弃策略和主题映射功能。 - Consumer: 让客户端应用订阅或拉取流中的消息,支持多种重放策略、确认机制和流控功能 - Persistence: 将流的数据复制到多个 NATS 服务器,提供容错能力和加密存储功能 - KV Store: 可以将消息与键关联,提供存储、检索、删除和监听键值变化的功能。 - Object Store: JetStream 可以存储任意大小的对象(如文件),提供分块、校验和、元数据等功能。 其中最核心(开发常用)的概念就是:stream 和 consumer。 |
10 | Stream https://docs.nats.io/nats-concepts/jetstream/streams |
流 | 流即是消息存储,它定义了消息的存储方式以及保留的限制。 更具体的内容参见 #5.1 Stream 配置解析 |
11 | Consumer | 消费者 | 消费者作为客户端的接口,使用存储在流中的消息,跟踪客户端传递和确认的消息。Nats 同时支持 pull 和 push 两种消费模式;consumer 还提供了 durable 配置,用于持久化 consumer 消费信息(除非设置了 InactiveThreshold) 更具体的内容参见 #5.2 Consumer 配置解析 |
12 | Replay / Redelivery | ||
13 | Raft Group https://docs.nats.io/running-a-nats-service/configuration/clustering/jetstream_clustering |
RAFT 组 | 对于特定内容达成一致的分组,nats 中有 meta, stream, consumer 几种组。 Meta: 全部节点都是组成员。负责:JetStream API + 集群管理。 Stream: (根据 replicas 配置选择组内的服务器成员)。负责:stream 数据 Consumer: (根据 stream group的成员来确定消费者组内的成员)。负责:消费者状态 |
14 | KV Store | 键值存储 | |
15 | Object Store | 对象存储 |
2. 软件架构(集群模式) #
Nats 自身是提供了多种运行方式:
...