重构消息队列模块,统一Redis/RabbitMQ/NATS客户端接口,新增消息代理抽象层

This commit is contained in:
2026-01-29 13:55:32 +08:00
committed by 张斌
parent 65b231b88f
commit a8993de6d5
8 changed files with 844 additions and 112 deletions

152
message/msg_queue.go Normal file
View File

@@ -0,0 +1,152 @@
package message
import (
"context"
"fmt"
)
type RedisConfig struct {
// Stream 名称
Stream string
// 消费者组名称
Group string
// 消费者名称
Consumer string
// 每次消费数量
Count int64
// 是否自动 ACK
AutoAck bool
// 处理函数
HandleFunc func(ctx context.Context, message map[string]interface{}) error
}
// RabbitMQConfig RabbitMQ 队列配置
type RabbitMQConfig struct {
Mode string
Exchange string
Topic string
DelayMessage bool
// 队列名称(必需)
Name string
// 实际队列名(用于绑定)
Queue string
// 是否持久化
Durable bool
// QoS 预取数量每次推送的消息数量默认10
PrefetchCount int
// 最大重试次数默认3
MaxRetry int
// 是否自动 ACK
AutoAck bool
// 处理函数
HandleFunc func(ctx context.Context, message map[string]interface{}) error
}
// NATSConfig NATS 队列配置
type NATSConfig struct {
DelayMessage bool
// Stream 名称
Stream string
// 消费者名称
Consumer string
// 是否持久化
Durable bool
// 副本数
Replicas int
// QoS 预取数量每次推送的消息数量默认10
PrefetchCount int
// 是否自动 ACK
AutoAck bool
// 处理函数
HandleFunc func(ctx context.Context, message map[string]interface{}) error
}
// messageBroker 消息代理接口
type messageBroker interface {
// StreamGroup 创建消费组(支持单个配置或批量配置)
streamGroup(ctx context.Context, configs ...interface{}) error
// Publish 发布消息(支持单个配置或批量配置)
publish(ctx context.Context, config interface{}, data interface{}) error
// PublishDelayed 发布延迟消息(支持单个配置或批量配置)
publishDelayed(ctx context.Context, config interface{}, data interface{}, delay int) error
// Subscribe 订阅消息(支持单个配置或批量配置)
subscribe(ctx context.Context, configs ...interface{}) error
}
type messageClientType string
const (
ClientTypeRedis messageClientType = "redis"
ClientTypeRabbitMQ messageClientType = "rabbitmq"
ClientTypeNATS messageClientType = "nats"
)
// newMessageBroker 创建消息代理实例
func newMessageBroker(ctx context.Context, clientType messageClientType) (messageBroker, error) {
switch clientType {
case ClientTypeRedis:
return &redisMessageClient{clientType: clientType}, nil
case ClientTypeRabbitMQ:
return &rabbitMQMessageClient{clientType: clientType}, nil
case ClientTypeNATS:
return &natsMessageClient{clientType: clientType}, nil
default:
return nil, fmt.Errorf("unknown client type: %s", clientType)
}
}
// StreamGroup 直接创建消费组
func StreamGroup(ctx context.Context, clientType messageClientType, configs ...interface{}) error {
broker, err := newMessageBroker(ctx, clientType)
if err != nil {
return err
}
return broker.streamGroup(ctx, configs...)
}
// Publish 直接发布消息
func Publish(ctx context.Context, clientType messageClientType, config interface{}, data interface{}) error {
broker, err := newMessageBroker(ctx, clientType)
if err != nil {
return err
}
return broker.publish(ctx, config, data)
}
// PublishDelayed 直接发布延迟消息
func PublishDelayed(ctx context.Context, clientType messageClientType, config interface{}, data interface{}, delay int) error {
broker, err := newMessageBroker(ctx, clientType)
if err != nil {
return err
}
return broker.publishDelayed(ctx, config, data, delay)
}
// Subscribe 直接订阅消息
func Subscribe(ctx context.Context, clientType messageClientType, configs ...interface{}) error {
broker, err := newMessageBroker(ctx, clientType)
if err != nil {
return err
}
return broker.subscribe(ctx, configs...)
}