消息隊列方案設計提示詞(Kafka / RabbitMQ / RocketMQ 選型、消息不丟、順序消費、重複消費)

要在系統裏引入消息隊列做異步解耦、削峰或事件通知時用:讓 AI 根據場景選型,並從生產、存儲、消費三個環節設計「消息不丟、不重複處理、需要時保證順序」的方案,附上失敗重試與死信處理。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名精通消息中間件的後端架構師。請為下面的場景設計消息隊列方案。

場景:
- 業務用途:[如訂單支付後通知積分、物流、短訊三個系統]
- 消息量:[消息量](例:平時每秒 200 條,峰值每秒 5000 條)
- 對可靠性的要求:[如絕對不能丟、偶爾重複可以接受]
- 是否需要順序:[如同一訂單的狀態變更必須按順序處理]
- 現有基礎設施與團隊熟悉的中間件:[已有中間件與團隊經驗](例:已有 Kafka 集群、團隊熟悉 RabbitMQ)
- 語言與客戶端庫:[語言/客戶端庫]

請依次回答:
1. 是否真的需要消息隊列:同步調用、數據庫任務表、消息隊列三種方案在本場景下的對比。
2. 選型:結合消息量、順序要求、延遲消息需求、運維能力,在常見的幾種中間件之間給出建議;優先複用已有基礎設施,除非有明確的不適合理由。
3. 消息不丟(分三個環節):
   - 生產端:發送確認機制;業務數據庫寫入與消息發送如何保持一致(如本地消息表 / 事務發件箱模式),避免「數據庫提交了但消息沒發出去」;
   - 存儲端:副本與持久化相關的關鍵配置;
   - 消費端:處理成功後再確認,處理失敗不確認或進入重試。
4. 重複消費:說明為什麼「恰好一次」通常無法單靠中間件實現,消費端如何做冪等(業務唯一鍵、去重表、狀態機)。
5. 順序:需要順序的消息怎麼路由到同一個分區或隊列;順序與並發吞吐之間的取捨;單條消息處理失敗時如何避免阻塞後續消息。
6. 失敗處理:重試次數與間隔、死信隊列、死信的告警和人工處理流程。
7. 消息格式:包含消息 ID、事件類型、發生時間、版本號、業務主鍵;消息體只放必要字段還是完整數據,說明取捨。
8. 給出生產端(含發件箱)和消費端(含冪等)的核心代碼。
9. 監控:消息積壓量、消費延遲、死信數量的告警閾值建議。

高亮處換成你自己的內容:[如訂單支付後通知積分、物流、短訊三個系統]、[消息量]、[如絕對不能丟、偶爾重複可以接受]、[如同一訂單的狀態變更必須按順序處理]、[已有中間件與團隊經驗]、[語言/客戶端庫]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[對可靠性的要求] 和 [是否需要順序] 決定了方案複雜度。通知類消息偶爾丟一條影響不大,扣款、發貨類消息絕對不能丟;只有同一個業務對象的消息需要順序,全局順序幾乎沒有必要,代價也很大。

常見坑:

  • 在數據庫事務裏直接發消息:事務回滾了,消息卻已經發出去;或者事務提交了,發消息時網絡斷了。用事務發件箱模式把「寫業務數據」和「記錄待發消息」放在同一個事務裏。
  • 消費端先確認再處理,處理過程中進程崩潰,消息就丟了。
  • 以為開啟了某種「精確一次」配置就不用做冪等。跨系統的業務操作仍然需要消費端去重。

追問技巧:追問「假設消費者處理到一半時宕機、消息中間件某個節點故障、網絡分區,分別會發生什麼」,逐一確認方案的薄弱環節。

示例輸出

示例,僅供參考(事務發件箱,節選)
sql
-- 與訂單更新在同一個數據庫事務裏寫入
INSERT INTO outbox (id, aggregate_id, event_type, payload, created_at, sent)
VALUES (?, ?, 'OrderPaid', ?, NOW(), FALSE);

後台任務定期掃描 sent = FALSE 的記錄發送到消息隊列,收到發送確認後再標記為已發送。由於可能重複發送,消費端必須冪等:

sql
INSERT INTO consumed_events (event_id) VALUES (?);  -- event_id 為主鍵,衝突即說明已處理
環節措施
生產事務發件箱 + 發送確認
存儲多副本,寫入需多數副本確認
消費處理成功後手動確認;失敗重試 5 次後進入死信隊列並告警

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~