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 协议实现数据的复制和一致性。
    在集群中,消息会被复制到多个节点,提高容错能力。



星如雨
1 声望0 粉丝

活到老,学到老,玩到老