NATS简介
2026/1/15大约 3 分钟
NATS简介
什么是 NATS
NATS 是一个开源的、轻量级、高性能的云原生消息系统,由 Derek Collison 创建,使用 Go 语言开发。NATS 的设计理念是"简单、安全、快速",它提供了一种简洁的方式来连接分布式系统中的各个组件。
核心特性
1. 极致简单
- 零配置启动,开箱即用
- 简洁的 API 设计
- 文本协议,易于调试
2. 超高性能
- 单服务器可处理数百万消息/秒
- 低延迟(微秒级)
- 内存占用小
3. 云原生
- 原生支持 Kubernetes
- 支持多种部署模式
- 自动发现和故障转移
4. 多语言支持
| 语言 | 客户端库 |
|---|---|
| Go | nats.go |
| Java | jnats |
| Python | nats.py |
| JavaScript | nats.js |
| C# | NATS.Client |
| Rust | nats.rs |
消息模式
NATS 支持三种核心消息模式:
1. 发布/订阅(Pub/Sub)
最基本的消息模式,发布者发送消息到主题,所有订阅该主题的订阅者都会收到消息。
// 发布者
nc.Publish("updates", []byte("Hello NATS"))
// 订阅者
nc.Subscribe("updates", func(m *nats.Msg) {
fmt.Printf("Received: %s\n", string(m.Data))
})2. 请求/响应(Request/Reply)
同步的请求-响应模式,适用于需要等待响应的场景。
// 请求方
msg, err := nc.Request("service", []byte("help"), time.Second)
// 响应方
nc.Subscribe("service", func(m *nats.Msg) {
nc.Publish(m.Reply, []byte("I can help"))
})3. 队列组(Queue Groups)
负载均衡模式,同一队列组中只有一个订阅者会收到消息。
// 多个 worker 加入同一队列组
nc.QueueSubscribe("tasks", "workers", func(m *nats.Msg) {
// 只有一个 worker 会处理这条消息
processTask(m.Data)
})NATS 生态系统
NATS Core
基础消息系统,提供"最多一次"(at-most-once)的消息传递保证。
JetStream
NATS 的持久化层,提供:
- 消息持久化存储
- 流(Stream)管理
- 消费者(Consumer)管理
- Key-Value 存储
- Object Store
NATS Tools
nats-cli:命令行工具nats-top:实时监控nats-bench:性能测试
NATS vs 其他消息队列
| 特性 | NATS | Kafka | RabbitMQ | Redis Pub/Sub |
|---|---|---|---|---|
| 性能 | 极高 | 高 | 中 | 高 |
| 持久化 | JetStream | 原生 | 原生 | 有限 |
| 复杂度 | 低 | 高 | 中 | 低 |
| 消息保证 | At-most-once/At-least-once | At-least-once | 多种 | At-most-once |
| 协议 | 文本 | 二进制 | AMQP | RESP |
| 适用场景 | 微服务、IoT | 大数据、日志 | 企业集成 | 简单场景 |
适用场景
推荐使用 NATS 的场景
- 微服务通信 - 服务间的轻量级消息传递
- IoT 设备通信 - 大量设备的消息收发
- 实时数据分发 - 股票行情、游戏状态同步
- 云原生应用 - Kubernetes 环境下的服务通信
- 边缘计算 - 资源受限环境下的消息传递
不推荐使用 NATS Core 的场景
- 需要严格消息顺序保证
- 需要消息持久化(可使用 JetStream)
- 需要复杂的路由规则
小结
NATS 是一个简单、快速、可靠的消息系统,特别适合云原生和微服务架构。它的核心优势在于极致的简单性和超高的性能,通过 JetStream 扩展还能满足持久化需求。
面试题预览
常见面试题
- NATS 的三种消息模式是什么?各有什么特点?
- NATS Core 和 JetStream 有什么区别?
- NATS 的队列组是如何实现负载均衡的?
