答案是Go中只有nats.Msg,无NatsMessage类型;其字段为Subject、Reply、Data、Sid,Reply在request/reply模式中至关重要;必须正确import"github.com/nats-io/nats.go"并用nats.Msg作回调参数。

别写 NatsMessage,Go 里只有 *nats.Msg
你搜“Go NATS 消息类型”却找不到 NatsMessage,不是文档太旧,是它压根不存在。Go 官方客户端 github.com/nats-io/nats.go 里唯一承载消息的结构体是 *nats.Msg,字段就四个:Subject、Reply、Data、Sid。硬要封装一层也行,但必须显式映射 Reply 字段——它在 request/reply 模式下是响应路由的关键,漏掉就收不到回包。
常见错误现象:undefined: NatsMessage 或 IDE 报“cannot use … as *nats.Msg”——说明你 import 错了包(比如写了 nats-go 或 natsclient),或者回调函数参数写成了自定义类型而非 *nats.Msg。
nats.Connect() 不设重连和认证,上线即瘫痪
本地用 nats://localhost:4222 能跑通,不等于生产环境能活。NATS 集群地址通常是逗号分隔的多个节点,比如 "nats://n1:4222,nats://n2:4222",客户端会自动轮询;TLS 和认证更是标配,裸连会被直接拒绝并打满 Authorization Violation 日志。
-
nats.MaxReconnects(-1):必须显式设为 -1,别信默认值(实际是 60 次后放弃) -
nats.ReconnectWait(2 * time.Second):防止重连风暴打爆服务端 -
nats.UserCredentials("nats.creds")或nats.Token("xxx"):缺一不可
JetStream 流处理不是开箱即用,js.AddStream() 必须手动预创建
NATS 默认是内存级“即发即忘”,要持久化、重放、按时间/大小保留消息,得靠 JetStream。但它不会自动建 Stream,你得自己调 js.AddStream() 显式注册——这步漏掉,js.Publish() 看似成功,实际消息全丢。
立即学习“go语言免费学习笔记(深入)”;
关键配置项:
-
Name:Stream 名,不能含通配符 -
Subjects:支持数组,如[]string{"orders.>"},但>只能出现在末尾 -
Storage: nats.FileStorage:磁盘存储,内存模式(nats.MemoryStorage)重启即失 -
MaxAge:比如24 * time.Hour,控制消息保留时长
如果 Stream 已存在,AddStream() 会返回 nats.ErrStreamNameAlreadyInUse,不是错误,可忽略。
请求-回复模式下,nc.Request() 的超时和无响应者检测必须处理
nc.Request("subject", []byte("req"), 5*time.Second) 看似简单,但两个边界情况极易被忽略:
- 超时返回
nats.ErrTimeout,不是nil错误,需单独判断 - 若无人订阅该
Subject,会立即返回nats.ErrNoResponders,而不是等超时——这是 NATS 内置的快速失败机制,别当成网络问题重试 -
Reply字段在*nats.Msg里是空字符串时,说明对方没走 request/reply 流程,而是用了普通Publish(),此时无法回传
流处理场景中,这类请求常用于查询状态或触发快照,不处理这些错误码,上游会卡死或反复重发。


















