golang如何使用NATS JetStream_golang NATS JetStream使用解析

张开发
2026/5/30 17:17:55 15 分钟阅读
golang如何使用NATS JetStream_golang NATS JetStream使用解析
JetStream连接必须显式初始化否则首次Publish会panic需在nats.Connect()后立即调nc.JetStream()并检查err不可延迟至业务逻辑中触发。JetStream连接必须显式初始化否则 Publish 会 panic很多人以为 nats.Connect() 后直接调 js.Publish() 就行结果一上线就 panic「JetStream not enabled on server」或「nil pointer dereference」。这不是客户端 bug而是服务端 JetStream 模块根本没开或者客户端没做初始化检查。必须在 nats.Connect() 成功后立刻调用 nc.JetStream()或 jetstream.New(nc)并检查返回的 err别等到第一次 Publish 才触发初始化——那时错误已发生在业务逻辑深处堆栈难追溯生产环境还要配凭证和重连nats.UserCredentials(user.creds)、nats.MaxReconnects(60)、nats.ReconnectJitter(100*time.Millisecond, time.Second)流Stream不创建消息就真的会丢裸连 NATS 发 nc.Publish(orders.created, data)消费者掉线 5 秒再上线之前的消息就没了。这不是配置错是设计如此——纯 NATS 是无状态 Pub/Sub不是队列。要持久化必须先建 Streamjs.AddStream(jetstream.StreamConfig{Subjects: []string{orders.*}, RetentionPolicy: jetstream.InterestPolicy})InterestPolicy 表示“只留当前有消费者关心的消息”比默认的 LimitsPolicy 更省空间但若所有消费者都下线消息也会被清理开发时可用 StorageType: jetstream.MemoryStorage 加速验证但切记内存流在服务器重启后全丢消费者收不到旧消息大概率是 DeliverPolicy 设错了订阅后只收到新消息查日志发现明明流里有几百条历史数据——八成是用了 nats.DeliverLastPolicy 或没设策略默认行为就是跳过已有消息。 文心快码 文心快码Comate是百度推出的一款AI辅助编程工具

更多文章