V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lixikei
0.01D
V2EX  ›  分享创造

[开源] 写一次代码,适配 6 种 MQ? Go 统一消息中间件适配层 正式版发布

  •  
  •   lixikei · 1 月 20 日 · 951 次点击

    在 Go 业务开发中,我们经常遇到这样的场景:

    • 环境切换:本地开发用 NATS 或 RabbitMQ 贪图轻快,线上却要接入 Kafka 或 AWS SQS 。
    • 代码耦合:业务逻辑被底层 MQ 的 SDK 对象(如 *rocketmq.Producer)绑定,一旦想换驱动,几乎要重写整个消息发送逻辑。
    • 配置坑多:每个 MQ 的参数设置五花八门,一不小心传错了参数,程序却静默运行,等到上线出事才发现配置没生效。

    为了解决这些痛点,我发起了 Unified MQ Broker for Go 项目。它就像是 MQ 领域的 "DBAL"(类似于 SQL 领域的 GORM 或数据库驱动层),让你通过一套 API 就能无缝切换多种消息中间件。

    🚀 v0.2.0 重磅更新

    经过一段时间的打磨,我们刚刚发布了 v0.2.0 版本。这次更新不只是增加了驱动,更是在“健壮性”和“性能”上做了深度优化:

    1. 🛡️ 独创“选项追踪” (Option Tracking)

    • 痛点:如果你给 Kafka 传了一个 SQS 的 DeduplicationID,大部分 SDK 会选择静默忽略。
    • 方案:v0.2.0 引入了审计机制。如果底层适配器没有读取你传入的某个配置项,系统会在连接或发布时发出显式警告。彻底告别因拼写错误或参数误用导致的配置无效。

    2. ⚡ 高性能“智能序列化” (Smart Serialization)

    • 优化:针对原始 []bytestring 数据实现了零拷贝路径,跳过冗余的 json.Marshal
    • 战果:压测显示,在高吞吐场景下,序列化性能提升了 5 倍以上(单次操作仅需 ~16ns )。

    3. 🏗️ 延迟绑定 (Late Binding)

    • NewBroker 现在仅做静态配置。
    • 真正的网络 IO 、TCP 建连和 SDK 初始化全部推迟到 Connect() 时执行,方便与依赖注入框架(如 Wire )集成。

    4. 🌐 全平台支持

    目前已完美支持:RocketMQ, Kafka, RabbitMQ, NATS, AWS SQS, GCP Pub/Sub


    💻 核心代码预览

    无论底层是哪种 MQ ,你的业务代码只需要关心这一套统一逻辑:

    import "github.com/qvcloud/broker"
    
    // 切换驱动只需要换一行初始化,业务代码 0 改动
    b := rabbitmq.NewBroker(broker.Addrs("amqp://..."))
    b.Connect()
    
    // 注入统一的中间件(如 OpenTelemetry 链路追踪)
    b.Init(broker.Middleware(otel.Middleware))
    
    // 统一的订阅 API
    b.Subscribe("orders.created", func(ctx context.Context, event broker.Event) error {
        fmt.Println("收到订单:", string(event.Message().Body))
        return nil // 返回 nil 自动 Ack ,返回 error 自动 Nack/Retry
    })
    
    // 统一的发布 API
    b.Publish(context.Background(), "orders.created", &broker.Message{
        Body: []byte(`{"id": 1001}`),
    })
    

    传送门

    GitHub: https://github.com/qvcloud/broker

    • 核心理念: 接口驱动、高性能、原生支持 OpenTelemetry 。

    如果你也深受 MQ 适配之苦,或者想为你的分布式系统寻找一个更规范的通信抽象,欢迎来试用、吐槽或贡献代码!如果你觉得不错,给个 Star 就是最大的支持。 🌟

    6 条回复    2026-01-21 09:47:14 +08:00
    chennqqi
        1
    chennqqi  
       1 月 20 日
    有点意思,不过似乎一般中写个 adapter 或者让 AI 写一个也不难,但有直接可用的了,点赞!
    best9999
        2
    best9999  
       1 月 20 日 via iPhone
    没有指定开源协议,是保留一切权利吗?
    misaka19000
        3
    misaka19000  
       1 月 20 日
    这种没经过长时间线上考验的库,谁敢用
    Need4more
        4
    Need4more  
       1 月 20 日
    用 java 的 spring cloud stream 吧,很成熟了
    Dganzh
        5
    Dganzh  
       1 月 21 日
    不支持 Redis ?
    lixikei
        6
    lixikei  
    OP
       1 月 21 日
    @chennqqi 大部分是 ai 写的 ai 规划的 我把 specs 目录都提交了 😄
    @best9999 随便用啊 怕啥
    @misaka19000 我自己用咯
    @Dganzh 今天让 ai 分析一下 加还是不加
    @Need4more 抱歉 我是 go 阵营的
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   4905 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 02:07 · PVG 10:07 · LAX 18:07 · JFK 21:07
    ♥ Do have faith in what you're doing.