RocketMQ在GoFrame框架中的实现方案
项目概述
在GoFrame框架中实现RocketMQ消息队列的完整解决方案。采用分层架构设计,包含配置管理、基础封装、业务逻辑和接口控制四个层次。
技术特点
配置管理
- 支持YAML配置文件管理连接信息
- 可动态切换消息队列类型(RocketMQ/RabbitMQ)
- 包含nameServer、group等核心配置项
基础封装(pkg层)
- 使用sync.Once确保单例初始化
- 封装生产者消费者实例管理
- 提供优雅关闭机制
- 统一的错误处理
业务逻辑(logic层)
- 实现消息发送与消费的核心逻辑
- 支持消息状态跟踪和持久化
- 提供消息重试机制
- 完整的日志记录
接口控制(controller层)
- 提供HTTP接口操作消息
- 统一的响应格式
- 完善的参数校验
- 友好的错误提示
应用场景
- 异步任务处理
- 系统间解耦
- 消息通知
- 延迟任务
- 流量削峰
扩展性
- 支持自定义消息处理逻辑
- 可扩展消息过滤规则
- 支持多种消息队列切换
- 便于二次开发
注意事项
- 需提前初始化连接
- 注意消息幂等性处理
- 建议添加监控告警
- 关注消息积压情况
代码实现
配置文件
# 消息队列配置
mq:
# 消息队列类型: rocketmq 或 rabbitmq
type: "rabbitmq"
# 是否启用消息队列
enabled: true
rocketmq:
nameServer: "127.0.0.1:9876"
producerGroup: "myProducerGroup"
consumerGroup: "myConsumerGroup"
brokerAddress: "127.0.0.1:10911" # 添加 broker 地址
rabbitmq:
url: "amqp://wanghaibin:[email protected]:5672/"
exchange: "gf_exchange"
dlx_exchange: "gf_dlx_exchange" # 新增:死信交换机
queue: "gf_queue"
delay_queue: "gf_delay_queue" # 新增:延迟队列
routingKey: "gf_key"
vhost: "/"
基础包实现
package rocketmq
import (
"context"
"sync"
"github.com/apache/rocketmq-client-go/v2"
"github.com/apache/rocketmq-client-go/v2/consumer"
"github.com/apache/rocketmq-client-go/v2/producer"
"github.com/gogf/gf/v2/frame/g"
)
// 全局变量定义
var (
once sync.Once
mqProducer rocketmq.Producer
mqConsumer rocketmq.PushConsumer
)
func Initialize() error {
once.Do(func() {
var err error
ctx := context.Background()
nameServer := g.Cfg().MustGet(ctx, "rocketmq.nameServer").String()
groupName := g.Cfg().MustGet(ctx, "rocketmq.groupName").String()
mqProducer, err = rocketmq.NewProducer(
producer.WithNameServer([]string{
nameServer}),
producer.WithGroupName(groupName),
producer.WithRetry(2),
)
if err != nil {
g.Log().Fatalf