[开源] 写一次代码,适配 6 种 MQ? Go 统一消息中间件适配层 正式版发布 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lixikei
0.01D

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

  •  
  •   lixikei 1 月 20 日 1355 次点击
    这是一个创建于 91 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 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 版本。这次更新不只是增加了驱动,更是在“健壮性”和“性能”上做了深度优化:

    <3>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     5511 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 102ms UTC 07:12 PVG 15:12 LAX 00:12 JFK 03:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86