Documentation
¶
Overview ¶
* @Author: kamalyes 501893067@qq.com * @Date: 2026-04-23 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-04-23 00:00:00 * @FilePath: \go-toolbox\pkg\natsx\client.go * @Description: go-toolbox/pkg/natsx 客户端核心结构体 * * 纯易用性封装,不管理连接生命周期,只接受 *nats.Conn * 连接由调用方(如 go-rpc-gateway)负责创建和关闭 * * Copyright (c) 2026 by kamalyes, All Rights Reserved.
* @Author: kamalyes 501893067@qq.com * @Date: 2026-04-20 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-04-20 00:00:00 * @FilePath: \go-toolbox\pkg\natsx\errors.go * @Description: go-toolbox/pkg/natsx 错误定义 * * Copyright (c) 2026 by kamalyes, All Rights Reserved.
* @Author: kamalyes 501893067@qq.com * @Date: 2026-04-23 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-04-23 00:00:00 * @FilePath: \go-toolbox\pkg\natsx\logger.go * @Description: go-toolbox/pkg/natsx 日志接口,直接复用 go-toolbox/pkg/logger * * Copyright (c) 2026 by kamalyes, All Rights Reserved.
* @Author: kamalyes 501893067@qq.com * @Date: 2026-04-23 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-04-23 00:00:00 * @FilePath: \go-toolbox\pkg\natsx\publish.go * @Description: go-toolbox/pkg/natsx 发布消息 * * Copyright (c) 2026 by kamalyes, All Rights Reserved.
* @Author: kamalyes 501893067@qq.com * @Date: 2026-04-23 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-04-23 00:00:00 * @FilePath: \go-toolbox\pkg\natsx\subscribe.go * @Description: go-toolbox/pkg/natsx 泛型事件订阅 * * 提供三种订阅模式: * - Subscribe:普通事件订阅(QueueSubscribe 负载均衡),泛型自动反序列化 * - SubscribeBroadcast:广播事件订阅(Subscribe 模式),所有订阅者都收到消息 * - SubscribeStreamBatch:批量流式消费(JetStream Pull 模式),支持批量拉取 * * 上下文传播(ctx 分层): * - 订阅级 base ctx:随调用方传入,取消即停止消费(优雅停机) * - 消息级 ctx:每条消息从 base ctx 派生,先经 ContextInjector 注入(如 trace_id), * 再叠加与 MaxAckWait 对齐的 deadline,消除「handler 仍在跑但 JetStream 已重投」的双活窗口 * * 消费者池: * - 局部消费者池:每个订阅创建独立 WorkerPool 处理消息 * - 全局消费者池:共享 Client 级别的 WorkerPool,通过 InitWorkerPool 初始化 * * Copyright (c) 2026 by kamalyes, All Rights Reserved.
Index ¶
- Variables
- func DeliveryCount(msg *nats.Msg) uint64
- func NewDefaultLogger() logger.ILogger
- func PublishEvent[T any](c *Client, eventName string, event *T) error
- func Subscribe[T any](ctx context.Context, c *Client, eventName, subscriberName string, ...) error
- func SubscribeBroadcast[T any](ctx context.Context, c *Client, eventName string, ...) error
- func SubscribeStreamBatch[T any](ctx context.Context, c *Client, eventName, subscriberName string, ...) error
- type ApplySubOptsFunc
- func WithBatchSize(batchSize int) ApplySubOptsFunc
- func WithConsumeFastest(consumeFastest bool) ApplySubOptsFunc
- func WithContextInjector(inj ContextInjector) ApplySubOptsFunc
- func WithEnableFlowControl() ApplySubOptsFunc
- func WithIdleHeartbeat(idleHeartbeat time.Duration) ApplySubOptsFunc
- func WithIntoGlobalPool() ApplySubOptsFunc
- func WithListenBroadcast() ApplySubOptsFunc
- func WithLocalPoolSize(size, queueSize int) ApplySubOptsFunc
- func WithMaxAckWait(maxAckWait time.Duration) ApplySubOptsFunc
- func WithMaxWait(maxWait time.Duration) ApplySubOptsFunc
- func WithMsgMaxRetry(msgMaxRetry uint64) ApplySubOptsFunc
- func WithMsgRetryInterval(msgRetryInterval time.Duration) ApplySubOptsFunc
- func WithRetryBackoff(backoff Backoff) ApplySubOptsFunc
- func WithUnlimitedDelivery() ApplySubOptsFunc
- type Backoff
- type Client
- func (c *Client) Close()
- func (c *Client) Conn() *nats.Conn
- func (c *Client) EnableJetStream() error
- func (c *Client) InitWorkerPool(workers, queueSize int)
- func (c *Client) IsConnected() bool
- func (c *Client) JetStream() nats.JetStreamContext
- func (c *Client) Publish(ctx context.Context, subject string, data []byte) error
- func (c *Client) PublishJetStream(ctx context.Context, subject string, data []byte, opts ...nats.PubOpt) (*nats.PubAck, error)
- func (c *Client) PublishWithRetry(ctx context.Context, subject string, data []byte, attemptCount int, ...) error
- func (c *Client) Request(ctx context.Context, subject string, data []byte, timeout time.Duration) (*nats.Msg, error)
- func (c *Client) Stats() map[string]interface{}
- func (c *Client) WorkerPool() *syncx.WorkerPool
- type ContextInjector
- type SubscribeOptions
Constants ¶
This section is empty.
Variables ¶
var ( ErrNotConnected = errors.New("nats: not connected") ErrAlreadyClosed = errors.New("nats: already closed") ErrInvalidSubject = errors.New("nats: invalid subject") ErrInvalidMessage = errors.New("nats: invalid message") ErrPublishFailed = errors.New("nats: publish failed") ErrSubscribeFailed = errors.New("nats: subscribe failed") ErrJetStreamFailed = errors.New("nats: jetstream operation failed") ErrBucketNotFound = errors.New("nats: kv bucket not found") ErrKeyNotFound = errors.New("nats: kv key not found") ErrTimeout = errors.New("nats: operation timed out") ErrGlobalPoolNotInitialized = errors.New("nats: global consumer pool not initialized, call InitWorkerPool first") // ErrPermanent 永久性失败哨兵错误 // handler 返回 errors.Is 命中此哨兵的错误时,库直接 Term 终止消息(不再重投), // 与 Nak 重试路径区分:格式损坏、业务上无法匹配等重试不可修复的场景 // 用法:return fmt.Errorf("%w: order not found", natsx.ErrPermanent) ErrPermanent = errors.New("nats: permanent failure, message will be terminated") )
Functions ¶
func DeliveryCount ¶
DeliveryCount 返回消息当前投递次数(1 = 首次投递) 非 JetStream 消息(Core NATS 模式)无投递元数据,返回 0
func PublishEvent ¶
PublishEvent 发布泛型事件(自动 JSON 序列化)
func Subscribe ¶
func Subscribe[T any](ctx context.Context, c *Client, eventName, subscriberName string, handleFunc func(ctx context.Context, evt *T) error, opts ...ApplySubOptsFunc) error
Subscribe 普通事件订阅(QueueSubscribe 负载均衡模式) 同一 queue 组内只有一个消费者收到某条消息,适合任务分发场景 泛型 T 自动反序列化消息体;ctx 为订阅级基础上下文,取消即停止消费(批量拉取模式下生效), 每条消息的处理 ctx 由库内派生(注入器 + AckWait deadline 对齐)
func SubscribeBroadcast ¶
func SubscribeBroadcast[T any](ctx context.Context, c *Client, eventName string, handleFunc func(ctx context.Context, evt *T) error, opts ...ApplySubOptsFunc) error
SubscribeBroadcast 广播事件订阅 所有订阅者都收到消息,适合事件通知、状态同步场景
func SubscribeStreamBatch ¶
func SubscribeStreamBatch[T any](ctx context.Context, c *Client, eventName, subscriberName string, handleFunc func(ctx context.Context, evts []*T) error, opts ...ApplySubOptsFunc) error
SubscribeStreamBatch 批量流式消费(JetStream Pull 模式) 基于 JetStream PullSubscribe 实现批量拉取消息;ctx 取消即停止拉取(优雅停机)
Types ¶
type ApplySubOptsFunc ¶
type ApplySubOptsFunc func(opt *SubscribeOptions)
ApplySubOptsFunc 订阅选项函数
func WithConsumeFastest ¶
func WithConsumeFastest(consumeFastest bool) ApplySubOptsFunc
WithConsumeFastest 设置是否尽快消费
func WithContextInjector ¶
func WithContextInjector(inj ContextInjector) ApplySubOptsFunc
WithContextInjector 设置消息级上下文注入器
func WithEnableFlowControl ¶
func WithEnableFlowControl() ApplySubOptsFunc
WithEnableFlowControl 开启流控
func WithIdleHeartbeat ¶
func WithIdleHeartbeat(idleHeartbeat time.Duration) ApplySubOptsFunc
WithIdleHeartbeat 设置消费者心跳时间
func WithLocalPoolSize ¶
func WithLocalPoolSize(size, queueSize int) ApplySubOptsFunc
WithLocalPoolSize 设置局部消费者池大小
func WithMaxAckWait ¶
func WithMaxAckWait(maxAckWait time.Duration) ApplySubOptsFunc
WithMaxAckWait 设置消息最长消费时间 同时决定消息级 ctx 的 deadline:处理超时 → ctx 先取消 → handler 快速失败 → Nak 重投
func WithMaxWait ¶
func WithMaxWait(maxWait time.Duration) ApplySubOptsFunc
WithMaxWait 设置批量消费最大等待时间
func WithMsgMaxRetry ¶
func WithMsgMaxRetry(msgMaxRetry uint64) ApplySubOptsFunc
WithMsgMaxRetry 设置消息最大重试次数
func WithMsgRetryInterval ¶
func WithMsgRetryInterval(msgRetryInterval time.Duration) ApplySubOptsFunc
WithMsgRetryInterval 设置消息重试间隔(固定间隔模式) 需要指数退避时改用 WithRetryBackoff,两者同时设置时退避优先
func WithRetryBackoff ¶
func WithRetryBackoff(backoff Backoff) ApplySubOptsFunc
WithRetryBackoff 设置指数退避重试策略 延迟序列:Base, Base*Factor, Base*Factor², ... 封顶于 Max;可选抖动打散重投风暴
func WithUnlimitedDelivery ¶
func WithUnlimitedDelivery() ApplySubOptsFunc
WithUnlimitedDelivery 无限重投模式 语义:消息消费失败后永远 Nak 重投,永不 Term(适用于资金、账务等不可丢失的消费场景)。 实现上等价于 MsgMaxRetry=0;与 WithMsgMaxRetry 互斥,后调用者生效
type Backoff ¶
type Backoff struct {
Base time.Duration // 首次重试延迟
Max time.Duration // 延迟上限
Factor float64 // 指数因子(每次延迟 = 上次 * Factor,<=0 时按 2.0 处理)
Jitter bool // 是否叠加 0~1 倍随机抖动,避免重投风暴同步
}
Backoff 重试退避策略(指数退避 + 抖动) 设置后退避计算优先于 MsgRetryInterval 固定间隔
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client NATS 易用性封装客户端
func (*Client) EnableJetStream ¶
EnableJetStream 启用 JetStream 上下文
func (*Client) InitWorkerPool ¶
InitWorkerPool 初始化全局消费者 WorkerPool workers: worker 数量,queueSize: 任务队列大小
func (*Client) JetStream ¶
func (c *Client) JetStream() nats.JetStreamContext
JetStream 返回 JetStream 上下文
func (*Client) PublishJetStream ¶
func (c *Client) PublishJetStream(ctx context.Context, subject string, data []byte, opts ...nats.PubOpt) (*nats.PubAck, error)
PublishJetStream 通过 JetStream 发布消息
func (*Client) PublishWithRetry ¶
func (c *Client) PublishWithRetry(ctx context.Context, subject string, data []byte, attemptCount int, interval time.Duration) error
PublishWithRetry 带重试的消息发布
func (*Client) Request ¶
func (c *Client) Request(ctx context.Context, subject string, data []byte, timeout time.Duration) (*nats.Msg, error)
Request 发送请求并等待响应
func (*Client) WorkerPool ¶
func (c *Client) WorkerPool() *syncx.WorkerPool
WorkerPool 返回全局 WorkerPool
type ContextInjector ¶
ContextInjector 消息级上下文注入器 每条消息分发前调用,用于从消息 Header 继承跨服务上下文(如 trace_id)或注入自定义值 依赖倒置设计:库自身不感知具体实现,由应用侧传入(如桥接网关中间件的 trace 逻辑)
type SubscribeOptions ¶
type SubscribeOptions struct {
IsListenBroadcast bool // 是否广播方式监听
IsIntoGlobalPool bool // 是否进入全局消费者池中消费
LocalPoolSize int // 局部消费者池大小
LocalPoolQueueSize int // 局部消费者池队列大小
BatchSize int // 批量消费的最大数量
MaxWait time.Duration // 批量消费最大等待消息时间
ConsumeFastest bool // 批量消费时是否尽快消费
MsgMaxRetry uint64 // 消息消费失败最大重试次数(0 表示无限重投,见 WithUnlimitedDelivery)
MsgRetryInterval time.Duration // 消息消费重试的时间间隔(固定间隔模式)
RetryBackoff *Backoff // 指数退避模式(设置后优先于 MsgRetryInterval)
MaxAckWait time.Duration // 消息最长消费时间(同时作为消息级 ctx 的 deadline)
IdleHeartbeat time.Duration // 消费者心跳时间
EnabledFlowControl bool // 是否开启流控机制
ContextInjector ContextInjector // 消息级 ctx 注入器(如注入 trace_id)
}
SubscribeOptions 订阅选项
func DefaultSubscribeOptions ¶
func DefaultSubscribeOptions() SubscribeOptions
DefaultSubscribeOptions 返回默认订阅选项