Go 工程師體系課 014【學習筆記】

rocketmq 快速入門

請參考我們的各種配置(podman),瞭解如何安裝。


概念介紹

RocketMQ 是阿里巴巴開源、Apache 頂級專案的分散式訊息中介軟體(middleware),核心元件(component):

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

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

程式碼範例本章以 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. 非同步傳送

非同步傳送不會阻塞主執行緒(thread),透過回呼(callback)取得結果,適合鏈路較長或吞吐量(throughput)要求高的場景。

// 異步發送
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. 普通訊息(訂閱)

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

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

要點:

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

2. 順序訊息

順序訊息分為全域順序和分區順序。常見做法是按業務鍵(例如訂單號)將訊息路由到同一個佇列(queue),保證「同一訂單」的訊息有序。

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

注意:要保證同一業務鍵落在同一個佇列(queue),消費者通常單執行緒(single thread)或按佇列(queue)串列處理。

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: 回查未確認事務

更多細節可參考本儲存庫(repository) 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/4787

(0)
Walker的頭像Walker
上一篇 2025年11月25日 14:00
下一篇 2025年11月25日 12:00

相關推薦

  • 無畏前行,拳釋力量 🥊💪

    拚搏,是一種態度。生活就像一場比賽,沒有捷徑可走,只有不斷訓練、突破、超越,才能站上屬於自己的舞台。這不僅是一種對抗,更是一種自我的覺醒——敢於迎戰,敢於挑戰,敢於成為更強的自己。 運動中的拚搏精神 無論是拳擊、跑步,還是力量訓練,每一次出拳、每一次揮汗、每一次咬牙堅持,都是對身體與心靈的磨練。拚搏不是單純的對抗,而是一種態度——面對挑戰,不退縮;面對失敗,…

    個人 2025年2月26日
    1.4K00
  • 向世界揮手,擁抱無限可能 🌍✨

    站得更高,看得更遠 生活就像一座座高樓,我們不斷向上攀登,不是為了炫耀高度,而是為了看到更廣闊的風景。圖中的兩位女孩站在城市之巔,伸展雙手,徬彿在迎接世界的無限可能。這不僅是一次俯瞰城市的旅程,更是對自由和夢想的禮讚。 勇敢探索,突破邊界 每個人的生活都是一場冒險,我們生而自由,就該去探索未知的風景,去經歷更多的故事。或許路途中會有挑戰,但正是那些攀爬的瞬間…

    個人 2025年2月26日
    1.4K00
  • Node深入淺出(聖思園教育) 003【學習筆記】

    WebSocket 與 SSE 總覽 WebSocket 基礎 定位:WebSocket 是一種在 HTTP 握手後升級的全雙工連線,允許用戶端與伺服器在同一 TCP 通道上雙向推送資料,省去了重複輪詢。 握手流程: 用戶端透過 Upgrade: websocket 標頭發起 HTTP 請求; 伺服器回應 101 Switching Protocols,雙方協…

    個人 2025年11月24日
    41800
  • 從0到1落地微前端架構 001【學習筆記】

    微前端 js 隔離css 隔離元素隔離生命週期預載入資料通訊應用程式跳轉多層巢狀 說明 使用的是 Mermaid 的 flowchart 語法,Markdown 渲染器如 Typora、VitePress、一些 Git 平台都支援。 保留了: 基座應用 main-vue3 各子應用:child-nuxt2-home、child-vue2-job、child-vu…

    2025年4月20日
    1.6K00
  • 深入理解ES6 005【學習筆記】

    解構:使用資料存取更便捷 如果使用 var、let 或 const 解構宣告變數,則必須要提供初始化程式(也就是等號右側的值)如下會導致錯誤 // 語法錯誤 var {tyep,name} // 語法錯誤 let {type,name} // 語法錯誤 const {type,name} 使用解構給已經宣告的變數賦值,如下 let node = { type:&qu…

    個人 2025年3月8日
    1.3K00
簡體中文 繁體中文 English