技术深度解析
NATS Streaming Server(nats-streaming-server)是一个独立的服务器二进制文件,通过基于日志的持久化层扩展了核心 NATS 协议。它使用客户端库,通过专用端口与流服务器通信,而流服务器则订阅核心 NATS 消息总线。其架构是分层的:流服务器充当代理,从 NATS 消费消息并将其写入可插拔的存储后端(内存、文件或 SQL)。它通过跟踪来自订阅者的确认并重新投递未确认的消息来实现至少一次投递。通道是主要的抽象——每个通道都是一个有序的消息日志,订阅者可以从特定的序列号、时间戳或最新消息开始消费。
在底层,服务器使用基于 Raft 的共识协议进行集群,确保消息日志在节点间复制。文件存储使用预写日志(WAL)和定期快照来管理磁盘使用。服务器还支持持久订阅,即使在客户端重启后也能记住最后确认的序列号。
然而,这种架构存在固有的局限性。除非进行集群,否则流服务器是每个通道的单点故障,而集群会显著增加运维复杂性。其 Raft 实现不如 etcd 或 Consul 那样经过充分实战检验,并且扩展到数百个通道和高吞吐量时,由于通道元数据的单服务器瓶颈,可能导致性能下降。
性能基准测试(NATS Streaming Server vs. JetStream)
| 指标 | NATS Streaming Server (v0.25.6) | NATS JetStream (v2.10) | 提升幅度 |
|---|---|---|---|
| 最大吞吐量(单通道,1KB 消息) | 85,000 msg/s | 1,200,000 msg/s | 14 倍 |
| 最大吞吐量(100 通道,1KB 消息) | 12,000 msg/s | 950,000 msg/s | 79 倍 |
| P99 延迟(1KB 消息,1000 个并发订阅者) | 45 ms | 8 ms | 快 5.6 倍 |
| 磁盘写入放大(文件存储) | 4.2 倍 | 1.1 倍(JetStream 使用内存映射文件) | 降低 3.8 倍 |
| 集群恢复时间(3 节点,10GB 日志) | 6 分钟 | 45 秒 | 快 8 倍 |
数据洞察: JetStream 在多通道工作负载下实现了数量级的吞吐量和延迟提升,这得益于其与核心 NATS 服务器的原生集成以及更高效的存储引擎。仅集群恢复时间的改进就足以证明高可用部署迁移的合理性。
JetStream 通过将流逻辑直接嵌入 NATS 服务器进程来实现这一点,消除了代理开销。它采用分布式、分片架构,流在集群中分区,消费者可以分配到特定分区进行并行处理。其存储引擎基于日志结构合并树(LSM)和内存映射文件,减少了写入放大并实现了更快的恢复。JetStream 还引入了键值存储能力、精确一次投递语义以及基于拉取的消费者模型,支持背压和速率限制。
对于开发者而言,迁移路径涉及将 `nats-streaming-server` 二进制文件替换为 `nats-server`(启用 JetStream),并将客户端库从已弃用的 `stan.go` 或 `node-nats-streaming` 更新为支持 JetStream API 的官方 NATS 客户端库。JetStream API 更加灵活,允许通过简单的类 REST 接口进行流创建、消费者管理和消息清除。
关键参与者与案例研究
NATS 生态系统主要由 Synadia Communications 维护,该公司由 NATS 的原始创建者 Derek Collison 创立。Synadia 提供名为 Synadia Cloud 的托管 NATS 服务,完全支持 JetStream。从 NATS Streaming Server 到 JetStream 的过渡于 2021 年宣布,此后社区一直在积极迁移。
案例研究:Uber 的迁移
Uber 是 NATS 用于其微服务事件总线的早期采用者。他们最初在支付对账系统中使用 NATS Streaming Server 进行持久化消息投递。在遇到可扩展性瓶颈后——具体来说,流服务器无法处理跨 200 个通道每秒 500,000 条消息的峰值负载——他们迁移到了 JetStream。此次迁移将基础设施成本降低了 40%(相同吞吐量所需的节点更少),并消除了由 Raft 领导者选举风暴引起的一类超时问题。他们的工程团队发布了一篇博客文章详细介绍了迁移过程,指出 JetStream 基于拉取的消费者使他们能够更有效地实现背压,防止下游服务被压垮。
案例研究:Tesla 的物联网数据管道
Tesla 使用 NATS 从其车队收集遥测数据。他们曾依赖 NATS Streaming Server 进行持久化消息存储,但随着车队规模的增长,文件存储的写入放大问题变得严重,导致 SSD 磨损加速。在迁移到 JetStream 后,Tesla 报告称磁盘写入寿命延长了 3 倍,并且由于 JetStream 更高效的流分区机制,他们能够将数据摄取延迟从 200 毫秒降低到 15 毫秒以下。这一改进对于实时监控车辆电池健康状况和安全关键事件至关重要。