nats 是一种高性能、轻量级的分布式消息系统,专为云原生架构设计。以简单性、高性能、低延迟闻名,适用于构建分布式系统和微服务架构。
NATS的核心特性
简单易用:
NATS的设计理念之一是保持简单,无需复杂的配置和管理。NATS 使用简单的主题(subjects)来实现消息的发布和订阅。
高性能:
NATS优化了内存管理和网络性能,处理消息高吞吐量、低延迟。在快速响应系统中表现极出色。支持每秒百万级消息传输。
高可扩展性:
NATS支持横向扩展,能够通过增加节点来增加系统的容量,并且具备较强的容错能力。即使一个节点出现故障,其他节点仍然可以继续工作,确保系统的高可用性。
支持多种传输协议:
除了标准的 TCP 连接外,NATS 还支持 WebSocket 和 HTTP/2 协议。这为应用提供了灵活的选择,特别是在需要 Web 集成或者不同协议支持时。
强大的消息路由:
NATS支持多个发布者和订阅者的消息路由。消息可以通过主题(subjects)进行分类,订阅者订阅特定主题,发布者向这些主题发布消息,从而实现灵活的消息分发和消费。
容错和高可用性:
NATS采用集群和复制机制,确保系统在节点故障时依然能保证消息的传递和高可用性。通过集群模式,NATS 可以在多个实例之间共享消息负载,并自动恢复服务。
支持持久化(可选) :
虽然NATS本身是一个内存为主的消息队列,通过JetStream扩展,提供消息持久化的选项,支持将消息存储在磁盘上,适用于需要可靠消息传递的场景。
安全性:
NATS支持 TLS 加密、认证和授权,确保消息传递过程中的数据安全。此外,它还可以与外部的身份验证系统进行集成,确保只有经过授权的用户能够访问系统。
队列组模式:
NATS支持队列组模式,允许多个订阅者共享消息负载,确保每个消息只被组中的一个消费者处理
监控与可观测性:
监控工具集成:NATS 提供了丰富的监控功能,可以与 Prometheus 等监控工具集成,实时监控系统状态和性能指标。
系统消息与事件:NATS 会发布系统消息(如客户端连接事件、服务器状态等),可以用于构建监控和异常检测工具。
NATS 的底层实现
订阅表:
NATS 使用订阅表(Subscription Table)来管理客户端的订阅关系:
Subject Subscription:将客户端订阅的主题映射到对应的订阅者列表。
Queue Group:在队列组模式下,订阅表会将同一队列组的订阅者视为一个逻辑单元,消息只会分发给队列组中的一个订阅者。
订阅表是一个hash字典,key是主题,value是订阅者的列表。
消息数据结构:
NATS 的消息(Msg)是其核心数据结构,包含以下部分:
Subject:消息的主题,用于标识消息的类型或目标。
Reply:可选的回复主题,用于请求-响应模式。
Payload:消息的实际负载,最大大小由 max_payload 参数限制。
Headers:可选的消息头,用于携带元数据。
内存和缓存:
NATS 使用内存来缓存消息和订阅信息,以提高性能:
Pending Messages:未确认的消息缓存在内存中,直到被确认或超时。
Max Pending:通过 max_pending 参数限制每个连接的缓存大小,防止内存占用过高。
集群和分布式存储:
在集群模式下,NATS 使用以下机制来管理分布式存储:
Leader Election:通过 Raft 协议选举流的领导者,确保数据一致性。
Replication:数据在集群节点间进行复制,以提高可用性和容错能力。
消息路径追踪:
NATS 提供消息路径追踪功能,用于监控消息的传输路径和延迟。这一功能通过消息头和日志记录实现。
消息传递的基本流程
1. 在 NATS 中,消息传递主要涉及以下三个角色:
发布者(Publisher):向 NATS 服务器发送消息的客户端。
订阅者(Subscriber):从 NATS 服务器接收消息的客户端。
NATS 服务器(Broker):负责消息的接收、存储和分发。
2. 消息传递的步骤
订阅者订阅主题:
订阅者向 NATS 服务器发送 SUB 命令,指定要监听的主题(Subject)。
NATS 服务器将订阅者的信息存储在订阅表中,以便后续分发消息。
发布者发布消息:
发布者向 NATS 服务器发送 PUB 命令,指定目标主题和消息负载。
NATS 服务器接收消息,并将其存储在内存中(或持久化存储中,如果启用了 JetStream)。
服务器分发消息:
NATS 服务器根据订阅表查找所有订阅了该主题的订阅者。
将消息分发给每个订阅者。
订阅者接收消息:
订阅者通过 MSG 命令从 NATS 服务器接收消息。
订阅者处理消息后,确认消息已接收(如果是持久化消息,如 JetStream)。
消息传递的关键机制
1. 主题(Subject)
NATS 使用主题来组织消息。
主题是简单的字符串,例如 test.subject 或 events.*。
NATS 支持通配符(* 和 >):
*:匹配单级主题,例如 events.* 匹配 events.order。
>:匹配多级主题,例如 events.> 匹配 events.order.created。
2. 订阅表(Subscription Table)
NATS 服务器维护一个订阅表,记录每个主题的订阅者信息。
当订阅者订阅一个主题时,服务器会将订阅者添加到该主题的订阅列表中。
当发布者发布消息时,服务器会根据订阅表查找订阅者,并将消息分发给他们。
3. 消息分发
NATS 支持两种主要的消息分发模式:
发布-订阅模式(Pub/Sub):
每条消息会被分发给所有订阅了该主题的订阅者。
队列组模式(Queue Groups):
多个订阅者可以加入同一个队列组,每条消息只会被队列组中的一个订阅者接收。
4. 消息确认(Acknowledge)
在普通 Pub/Sub 模式下,消息确认是可选的。
在 JetStream 中,消息确认是强制的。订阅者需要显式确认消息已处理,否则服务器会重试发送。
消息传递的性能优化
NATS 的消息传递机制设计得非常高效,主要体现在以下方面:
内存缓存:
NATS 服务器将消息缓存在内存中,以实现快速分发。
通过 max_pending 参数限制每个连接的缓存大小,防止内存占用过高。
异步处理:
NATS 服务器和客户端都支持异步消息处理,减少延迟。
轻量级协议:
NATS 使用简单的文本协议,减少解析开销。
负载均衡:
在队列组模式下,消息会被随机分发给队列组中的一个订阅者,实现负载均衡。
消息传递的可靠性
NATS 提供了多种机制来确保消息传递的可靠性:
持久化存储(JetStream):
如果启用了 JetStream,消息会被持久化存储到磁盘,防止消息丢失。
支持消息重放和持久化订阅。
消息确认(Acknowledge):
订阅者处理完消息后,需要向服务器发送确认(Ack)。
如果消息未确认,服务器会重试发送。
集群和冗余:
NATS 支持集群模式,通过 Raft 协议实现数据的复制和一致性。
在集群中,消息会被复制到多个节点,提高容错能力。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。