Nats 使用
消息队列Kafka比较重, 而且官方也在逐渐放弃zk, 转向raft, 如果想要在性能和灵活性上有所有选择,不妨考虑下NATS和NSQ, 他们都是现代分布式系统中广泛使用的消息传递系统, 这里我选择NATS, 如果对选型感兴趣可以看后面选型部份
配置组件
- toml
- env
[nats]
url = "nats://127.0.0.1:4222"
token = ""
NATS_URL="nats://127.0.0.1:4222"
NATS_TOEKN=""
基本使用
package main
import (
"context"
"fmt"
"time"
"github.com/infraboard/mcube/v2/ioc"
ioc_nats "github.com/infraboard/mcube/v2/ioc/config/nats"
"github.com/infraboard/mcube/v2/ioc/server"
"github.com/nats-io/nats.go"
)
const (
TEST_SUBJECT = "event_bus"
)
func main() {
ioc.DevelopmentSetup()
// 订阅消息
_, err := ioc_nats.Get().Subscribe(TEST_SUBJECT, func(msg *nats.Msg) {
fmt.Println(string(msg.Data))
})
if err != nil {
fmt.Println(err)
}
// 发布消息
go func() {
for {
time.Sleep(1 * time.Second)
err = ioc_nats.Get().Publish(TEST_SUBJECT, []byte("test"))
if err != nil {
fmt.Println(err)
}
}
}()
// 启动应用
err = server.Run(context.Background())
if err != nil {
panic(err)
}
}
选型
NATS是一个开源、轻量级、高性能的分布式消息通信系统,由Apcera公司开发并开源。它采用Go语言编写,设计目标是实现"高性能(fast)、高可用(dial tone)、轻量级(small footprint)"13。NATS强调极简主义,提供最基本的消息传递功能,追求极致的性能和低延迟。它支持三种消息模式:发布/订阅(Publish/Subscribe)、请求/响应(Request/Reply)和队列(Queueing)3。
NSQ同样是一个基于Go语言的分布式实时消息平台,由bitly公司开源。NSQ的设计目标是为分布式环境提供一个去中心化的服务架构,能够每天处理数十亿条消息26。与NATS不同,NSQ更注重消息的可靠传递和易用性,提供了内置的消息持久化、管理界面等特性,适合需要更高可靠性的场景。
NATS vs NSQ 核心特性对比
1. 基本特性对比
特性 | NATS | NSQ |
---|---|---|
消息传递语义 | 最多一次(默认),NATS Streaming提供至少一次 | 至少一次 |
持久化支持 | 需NATS Streaming模块支持 | 内置支持(内存+磁盘) |
消息顺序 | 不保证 | 不保证 |
集群支持 | 原生支持集群和超级集群 | 通过nsqlookupd 实现服务发现 |
管理界面 | 简单监控界面 | 提供功能完善的Web管理界面nsqadmin |
消息大小限制 | 1MB | 可配置,默认较小 |
安全特性 | 2.0支持多租户和TLS | 早期版本无鉴权,新版有所改进 |
2. 性能对比
指标 | NATS | NSQ |
---|---|---|
吞吐量 | 每秒8-11百万条消息(Go版本) | 每天可处理数十亿条消息 |
延迟 | 极低延迟(小于1毫秒) | 低延迟,适合实时消息 |
资源占用 | 轻量级(Docker镜像仅3MB) | 内存+磁盘混合模式 |