Go工程師體系課 014

rocketmq 快速入門

去我們的各種配置(podman)看是怎麼安裝的


概念介紹

RocketMQ 是阿里開源、Apache 頂級項目的分佈式消息中間件,核心組件:

  • NameServer:服務發現與路由
  • Broker:消息存儲、投遞、拉取
  • Producer:消息生產者(發送消息)
  • Consumer:消息消費者(訂閱並消費消息)
  • Topic/Tag:主題/標籤,用於消息分組與過濾

生產與消費模型:Producer 將消息發送到某個 Topic;Broker 進行持久化並供 Consumer 拉取;Consumer 以集羣或廣播模式消費。

代碼示例本章以 Go 爲例(僞代碼/示意),不同 SDK 方法名略有差異,請以實際版本爲準。


按照發送的特點分

1. 同步發送

同步發送會等待 Broker 返回發送結果,適合對可靠性有要求的場景(如下單、創建訂單事件)。

// 同步發送
msg := rocketmq.NewMessage("OrderTopic", []byte("order-created"))
res, err := producer.SendSync(context.Background(), msg)
if err != nil {
    // 失敗處理/重試
}
log.Printf("SendOK: %v", res)

2. 異步發送

異步發送不會阻塞主線程,通過回調獲取結果,適合鏈路較長或吞吐要求高的場景。

// 異步發送
msg := rocketmq.NewMessage("LogTopic", []byte("user-action"))
producer.SendAsync(context.Background(), msg, func(res *SendResult, err error) {
    if err != nil {
        // 記錄失敗,後續重試
        return
    }
    log.Printf("AsyncSendOK: %v", res)
})

3. 單向發送(OneWay)

單向發送只負責把消息“盡力而爲”地發出,不關心結果,適用於日誌收集、埋點等對可靠性要求低的場景。

// 單向發送
_ = producer.SendOneWay(context.Background(), rocketmq.NewMessage("TraceTopic", []byte("trace")))

按照使用功能特點分

1. 普通消息(訂閱)

最常見的發佈/訂閱模型。消費者可採用集羣模式(負載均衡)或廣播模式(每個消費者都收到)。

// 消費者訂閱普通消息
consumer.Subscribe("OrderTopic", rocketmq.FilterByTag("created"), func(msg *MessageExt) ConsumeResult {
    // 冪等處理
    // 業務邏輯...
    return ConsumeSuccess
})

要點:

  • 冪等性:用業務唯一鍵或去重表避免重複消費
  • 重試與死信:失敗返回重試,超過閾值進入 DLQ

2. 順序消息

順序消息分爲全局順序和分區順序。常見做法是按業務鍵(如訂單號)將消息路由到同一個隊列,保證“同一訂單”的消息有序。

// 生產者按業務鍵選擇隊列(示意)
shardingKey := orderID
msg := rocketmq.NewMessage("OrderSeqTopic", []byte("status-changed"))
msg.WithShardingKey(shardingKey)
_, _ = producer.SendSync(ctx, msg)

注意:要保證同一業務鍵落在同一隊列,消費者通常單線程或按隊列串行處理。

3. 延時消息(定時/延遲)

用於在指定時間後再投遞給消費者,例如“訂單超時取消”“支付結果稍後檢查”等。

// 發送 30s 後可見的延時消息(不同 SDK 可用 delayLevel 或 deliverTime)
msg := rocketmq.NewMessage("DelayTopic", []byte("close-order"))
msg.SetDelay(time.Second * 30)
_, _ = producer.SendSync(ctx, msg)

實踐要點:

  • 合理的延遲等級/絕對投遞時間
  • 消費端仍需冪等與補償

4. 事務消息(分佈式事務)

用於保證“本地事務 + 消息”最終一致。流程:發送半消息 → 執行本地事務 → 根據結果 Commit/Rollback;Broker 未收到確認會回查業務狀態。

sequenceDiagram
  participant P as Producer
  participant MQ as RocketMQ
  participant DB as LocalDB
  P->>MQ: 發送半消息
  P->>DB: 執行本地事務
  alt 成功
    P->>MQ: Commit
    MQ->>C: 投遞正式消息
  else 失敗
    P->>MQ: Rollback
  end
  MQ->>P: 回查未確認事務

更多細節可參考本倉庫 013.md 中“事務消息”與“TCC/本地消息表”等章節。


生產者與消費者快速示例

// Producer 初始化(示意)
producer, _ := rocketmq.NewProducer(rocketmq.ProducerConfig{
    NameServer: []string{"127.0.0.1:9876"},
    Group:      "demo-producer-group",
})
defer producer.Shutdown()

// Consumer 初始化(示意)
consumer, _ := rocketmq.NewPushConsumer(rocketmq.ConsumerConfig{
    NameServer: []string{"127.0.0.1:9876"},
    Group:      "demo-consumer-group",
    Model:      rocketmq.Clustering, // 或 Broadcasting
})
defer consumer.Shutdown()

分佈式事務消息的優勢

  • 解耦:上下游通過事件協作,降低強耦合
  • 彈性與可擴展:異步削峯,支持高併發
  • 可靠性:消息持久化,失敗可重試/對賬
  • 最終一致:在 AP 取捨下通過補償與回查達到一致

適用場景:訂單創建/支付、庫存扣減、積分/優惠券發放、資金記賬、狀態同步等。


常見實踐建議

  • 消費端冪等:唯一業務鍵、去重表、樂觀鎖
  • 失敗重試與死信隊列(DLQ)配置
  • 監控與告警:積壓、失敗率、耗時
  • 結合延時消息實現“超時關閉/回查”
  • 事務消息只在關鍵鏈路使用,其餘用本地消息表或最大努力通知

主題測試文章,只做測試使用。發佈者:Walker,轉轉請注明出處:https://www.walker-learn.xyz/archives/6780

(0)
Walker的頭像Walker
上一篇 2026年3月6日 05:30
下一篇 2026年3月6日 04:30

相關推薦

  • Go工程師體系課 005

    微服務開發 創建一個微服務項目,所有的項目微服務都在這個項目中進行,創建joyshop_srv,我們無創建用戶登錄註冊服務,所以我們在項目目錄下再創建一個目錄user_srv 及user_srv/global(全局的對象新建和初始化)user_srv/handler(業務邏輯代碼)user_srv/model(用戶相關的 model)user_srv/pro…

    後端開發 2026年3月7日
    7000
  • Go工程師體系課 015

    Docker 容器化 —— Go 項目實戰指南 一、Docker 核心概念 1.1 什麼是 Docker Docker 是一個開源的容器化平臺,它可以將應用程序及其所有依賴項打包到一個標準化的單元(容器)中,從而實現"一次構建,到處運行"。對於 Go 開發者而言,Docker 解決了以下痛點: 開發環境與生產環境不一致 依賴管理複雜(數據庫、緩存、消息隊列等…

    後端開發 2026年3月7日
    9900
  • Go工程師體系課 004

    需求分析 後臺管理系統 商品管理 商品列表 商品分類 品牌管理 品牌分類 訂單管理 訂單列表 用戶信息管理 用戶列表 用戶地址 用戶留言 輪播圖管理 電商系統 登錄頁面 首頁 商品搜索 商品分類導航 輪播圖展示 推薦商品展示 商品詳情頁 商品圖片展示 商品描述 商品規格選擇 加入購物車 購物車 商品列表 數量調整 刪除商品 結算功能 用戶中心 訂單中心 我的…

    2026年3月7日
    7300
  • Go工程師體系課 006

    項目結構說明:user-web 模塊 user-web 是 joyshop_api 工程中的用戶服務 Web 層模塊,負責處理用戶相關的 HTTP 請求、參數校驗、業務路由以及調用後端接口等功能。以下是目錄結構說明: user-web/ ├── api/ # 控制器層,定義業務接口處理邏輯 ├── config/ # 配置模塊,包含系統配置結構體及讀取邏輯 …

    後端開發 2026年3月6日
    6700
  • Go工程師體系課 003

    grpc grpc grpc-go grpc 無縫集成了 protobuf protobuf 習慣用 Json、XML 數據存儲格式的你們,相信大多都沒聽過 Protocol Buffer。 Protocol Buffer 其實是 Google 出品的一種輕量 & 高效的結構化數據存儲格式,性能比 Json、XML 真的強!太!多! protobuf…

    後端開發 2026年3月6日
    7700
簡體中文 繁體中文 English