跳至主要內容
版本:5.0

常見問題集

關於 RocketMQ 專案的常見問題

1 基本

  1. 為什麼我們應該使用 RocketMQ,而不是選擇其他產品?

    請參閱為何選擇 RocketMQ

  2. 我是否需要安裝任何其他軟體才能使用 RocketMQ,例如 ZooKeeper?

    否,RocketMQ 可以獨立執行。

2 使用

  1. 新建立的 ConsumerGroup 從何處開始使用訊息?

    1)5.x SDK 第一次上線時,將從伺服器上的最新訊息開始使用,從佇列的尾端開始。重新啟動後,將繼續從上次使用的最後位置開始使用。

    2)3.x/4.x SDK 較為複雜。如果第一次啟動是在傳送訊息的三天內,使用者將從伺服器上儲存的第一個訊息開始使用。如果傳送的訊息超過三天,使用者將從伺服器上的最新訊息開始使用,從佇列的尾端開始。重新啟動後,將繼續從上次使用的最後位置開始使用。

  2. 當使用失敗時,如何再次使用訊息?

    1)在叢集模式中,使用業務邏輯程式碼將傳回使用失敗狀態,或擲回例外。如果訊息使用失敗,將根據設定的最大重試次數重試,然後訊息將被捨棄。

    2)在廣播消費模式下,廣播消費依然保證消息至少被消費一次,但沒有重發機制。

  3. 消費失敗後,如何定位失敗消息?

    1)通過時間範圍查詢主題,可以查詢到時間範圍內的消息。

    2)通過 Topic 和 Message ID 精確查詢消息。

    3)通過 Topic 和 Message Key 精確查詢所有 Message Key 相同的消息。

  4. 消息是否只投遞一次?

    RocketMQ 保證所有消息至少投遞一次,絕大多數情況下消息不會重複。

  5. 如何新增一個新的 Broker?

    1)啟動一個新的 Broker,並在 NameServer 的 Broker 列表中註冊。

    2)默認情況下,只會自動創建內部系統 Topic 和 Consumer Group,如果希望在新的節點上也有自己的業務 Topic 和 Consumer Group,需要從已有的 Broker 上拷貝,我們提供了管理工具和命令行來處理。

3 配置相關

以下回答為默認值,通過配置可以修改。

  1. 消息在服務器上最多可以保存多長時間?

    消息最多保存 3 天,超過 3 天未被消費的消息將被刪除。

  2. 消息體大小限制是多少?

    一般為 256KB。

  3. 如何設置消費線程數?

    在啟動消費者時可以設置,不同版本參數名不同。

4 錯誤

  1. APPLY_TOPIC_URL

    • 異常信息

      topic[xxx] not exist, apply first please!
    • 原因

      1)生產者發送消息或消費者消費消息時,如果無法獲取 Topic 的路由信息,將會出現此異常。

    • 解決方案

      1)確認 NameServer 中確實存在該 Topic 的路由信息,可以使用管理工具或 Web 控制台通過 TopicRoute 從 NameServer 中查詢路由信息;

      2)確認 Broker 和 Consumer 連接的 NameServer 集群相同;

      3)確認 Topic 對應的隊列權限,生產者為 6(rw-),消費者至少為 2(-w-);

      如果 Topic 不存在,通過管理工具命令 updateTopic 或 Web 控制台在 Broker 上創建。

  2. NAME_SERVER_ADDR_NOT_EXIST_URL

    • 異常信息

      No name server address, please set it

      connect to xxx failed, maybe the domain name xxx not bind in /etc/hosts
    • 原因

      1)生產者或消費者,獲取 NameServer 地址信息出錯。

    • 解決方案

      1)請參考:5.1 客戶端地址解析

  3. GROUP_NAME_DUPLICATE_URL

    • 異常信息

      The producer group[xxx] has been created before, specify another name please.
    • 原因

      1)已經啟動了同名的消費者組,註冊失敗。

    • 解決方案

      1)重新命名一個新的消費者組。

      2)同名的消費者組正常關閉後,又重新啟動。

  4. CLIENT_PARAMETER_CHECK_URL

    • 異常信息

      consumerGroup can not equal ...

      allocateMessageQueueStrategy is null ...

      Long polling mode, the consumer consumerTimeoutMillisWhenSuspend must greater than brokerSuspendMaxTimeMillis ...

      除了以上異常,還可能存在其他未列出的異常。

    • 原因

      1)消費者參數驗證失敗。

    • 解決方案

      1)請參考: 5.2 客戶端配置

  5. SUBSCRIPTION_GROUP_NOT_EXIST

    • 異常信息

      subscription group not exist
    • 原因

      1)消費者組或 DleayQueue 在獲取訂閱信息時出錯。

    • 解決方案

      1)確保消費者訂閱的 Topic 信息與 NameServer 中的 Topic 信息一致。

      2)確保 Broker 和消費者連接到同一個 NameServer 集群。

      3)確保 Topic 的隊列權限對生產者為 6 (rw-),對消費者至少為 2 (-w-)

  6. CLIENT_SERVICE_NOT_OK

    • 異常信息

      The xxx service state not OK, maybe started once
    • 原因

      1)在同一個 JVM 中使用同一個生產者/消費者組啟動多個生產者/消費者實例,可能會導致客戶端啟動失敗。

    • 解決方案

      1)確保對於給定的生產者/消費者組 JVM,只啟動一個生產者/消費者實例。

  7. NO_TOPIC_ROUTE_INFO

    • 異常信息

      No route info of this topic:
    • 原因

      1)如果向生產者不可用的 Topic 發送消息,就會發生這種情況。

    • 解決方案

      1)確保生產者能夠連接到 NameServer 並從中獲取路由元數據。

      2)確保 NameServer 包含該 Topic 的路由元數據。您可以使用管理工具或 Web 控制台使用 TopicRoute 從 NameServer 查詢路由元數據。

      3)確保您的 Broker 向與您的生產者連接的同一個 NameServer 列表發送心跳。

      4)確保該 Topic 的權限為 6 (rw-),或至少為 2 (-w-)。

      如果找不到該 Topic,請通過管理工具命令 updateTopic 或 Web 控制台在 Broker 上創建它。

  8. LOAD_JSON_EXCEPTION

    • 異常信息

      readLocalOffset Exception
    • 原因

      1)廣播模式下,消費者加載 local offsets.json 檔案時出現錯誤。

      2)fastjson 檔案損毀也會導致相同問題。

    • 解決方案

      1)檢查使用的 fastjson 版本與 RocketMQ 版本是否一致。

      2)升級 fastjson 版本。

  9. SAME_GROUP_DIFFERENT_TOPIC

    • 異常信息

      the consumer's group info/subscription not exist
    • 原因 1)消費者訂閱的 Topic 資訊不存在。

    • 解決方案

      1)檢查消費者所屬的消費者群組是否存在。

      2)檢查消費者訂閱的 Topic 是否存在。

  10. MQLIST_NOT_EXIST

    • 異常信息

      Can not find Message Queue for this topic
    • 原因 1)對生產者來說,根據 Topic 無法取得對應的佇列資訊。

    • 解決方案

      1)確保已針對 Topic 正確設定佇列資訊。

      2)確保對應 Topic 的佇列至少具有 2 個 (-w-) 權限。

  11. SEND_MSG_FAILED

    • 異常信息

      Send [xxx] times, still failed, cost [xxx]ms, Topic: xxx, BrokersSent ...
    • 原因 1)生產者訊息傳送異常。SYNC 模式下共傳送 3 次,ASYNC 和 ONEWAY 模式下傳送 1 次。

    • 解決方案 1)生產者傳送訊息的 timeout 參數是否設定太小。

      2)確保 Broker 正常。

      3)確保生產者與 Broker 之間的連線正常。

  12. UNKNOWN_HOST_EXCEPTION

    • 異常信息

      InetAddress java.net.InetAddress.getLocalHost() throws UnknownHostException
    • 原因

      1)主機上可能有多個網路介面,且一個介面可能繫結多個 IP 位址。

    • 解決方案

      1)確保對應主機的 IP 能正常存取,並使用 Ping 等網路指令檢查網路狀況。

5 其他

  1. Broker 發生故障會造成什麼影響?

    1)主節點發生故障

    訊息無法再傳送到 Broker 集群,但如果還有其他可用的 Broker 集群,只要主題存在,訊息仍可傳送。仍可從備用節點使用訊息。

    2)部分備用節點發生故障

    只要還有其他可用的備用節點,傳送訊息不會受到影響。使用訊息不會受到影響,除非消費者群組設定為先從備用節點使用。預設消費者群組會從主節點使用。

    3)所有備用節點發生故障

    傳送訊息到主節點不會受到影響,但如果主節點是 SYNC_MASTER,生產者會收到 SLAVE_NOT_AVAILABLE 訊息,表示訊息未傳送到任何備用節點。使用訊息不會受到影響,除非消費者群組設定為先從備用節點使用。預設消費者群組會從主節點使用。