Skip to main content

Nats 使用

消息队列Kafka比较重, 而且官方也在逐渐放弃zk, 转向raft, 如果想要在性能和灵活性上有所有选择,不妨考虑下NATS和NSQ, 他们都是现代分布式系统中广泛使用的消息传递系统, 这里我选择NATS, 如果对选型感兴趣可以看后面选型部份

配置组件

[nats]
url = "nats://127.0.0.1:4222"
token = ""

基本使用

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. 基本特性对比

特性NATSNSQ
消息传递语义最多一次(默认),NATS Streaming提供至少一次至少一次
持久化支持需NATS Streaming模块支持内置支持(内存+磁盘)
消息顺序不保证不保证
集群支持原生支持集群和超级集群通过nsqlookupd实现服务发现
管理界面简单监控界面提供功能完善的Web管理界面nsqadmin
消息大小限制1MB可配置,默认较小
安全特性2.0支持多租户和TLS早期版本无鉴权,新版有所改进

2. 性能对比

指标NATSNSQ
吞吐量每秒8-11百万条消息(Go版本)每天可处理数十亿条消息
延迟极低延迟(小于1毫秒)低延迟,适合实时消息
资源占用轻量级(Docker镜像仅3MB)内存+磁盘混合模式

3. 使用场景对比

场景NATS适用场景NSQ适用场景
微服务通信高性能、低延迟的微服务通信总线简单可靠的消息队列
物联网(IoT)支持叶节点,适合边缘计算可用于设备数据采集
实时数据分析低延迟传输,适合金融交易日志和事件处理
云原生集成CNCF项目,Kubernetes集成良好部署简单,适合快速迭代

4. 可扩展性对比

扩展能力NATSNSQ
水平扩展支持超级集群,全球分布式部署支持无缝添加节点
高可用性集群模式支持故障转移去中心化设计,无单点故障
动态扩容支持叶节点扩展边缘网络通过nsqlookupd动态发现节点

关键结论

  • 选择NATS:适用于需要极低延迟、高性能通信的场景,如微服务、IoT和金融交易159。
  • 选择NSQ:适用于简单可靠的消息队列需求,如日志处理、数据管道和初创项目

NSQ的的场景 没kafka做得好, 因此这里便想要选择灵活强性能强的 NATS