常見問題集
關於 RocketMQ 專案的常見問題
1 基本
為什麼我們應該使用 RocketMQ,而不是選擇其他產品?
我是否需要安裝任何其他軟體才能使用 RocketMQ,例如 ZooKeeper?
否,RocketMQ 可以獨立執行。
2 使用
新建立的 ConsumerGroup 從何處開始使用訊息?
1)5.x SDK 第一次上線時,將從伺服器上的最新訊息開始使用,從佇列的尾端開始。重新啟動後,將繼續從上次使用的最後位置開始使用。
2)3.x/4.x SDK 較為複雜。如果第一次啟動是在傳送訊息的三天內,使用者將從伺服器上儲存的第一個訊息開始使用。如果傳送的訊息超過三天,使用者將從伺服器上的最新訊息開始使用,從佇列的尾端開始。重新啟動後,將繼續從上次使用的最後位置開始使用。
當使用失敗時,如何再次使用訊息?
1)在叢集模式中,使用業務邏輯程式碼將傳回使用失敗狀態,或擲回例外。如果訊息使用失敗,將根據設定的最大重試次數重試,然後訊息將被捨棄。
2)在廣播消費模式下,廣播消費依然保證消息至少被消費一次,但沒有重發機制。
消費失敗後,如何定位失敗消息?
1)通過時間範圍查詢主題,可以查詢到時間範圍內的消息。
2)通過 Topic 和 Message ID 精確查詢消息。
3)通過 Topic 和 Message Key 精確查詢所有 Message Key 相同的消息。
消息是否只投遞一次?
RocketMQ 保證所有消息至少投遞一次,絕大多數情況下消息不會重複。
如何新增一個新的 Broker?
1)啟動一個新的 Broker,並在 NameServer 的 Broker 列表中註冊。
2)默認情況下,只會自動創建內部系統 Topic 和 Consumer Group,如果希望在新的節點上也有自己的業務 Topic 和 Consumer Group,需要從已有的 Broker 上拷貝,我們提供了管理工具和命令行來處理。
3 配置相關
以下回答為默認值,通過配置可以修改。
消息在服務器上最多可以保存多長時間?
消息最多保存 3 天,超過 3 天未被消費的消息將被刪除。
消息體大小限制是多少?
一般為 256KB。
如何設置消費線程數?
在啟動消費者時可以設置,不同版本參數名不同。
4 錯誤
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 上創建。
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 客戶端地址解析
GROUP_NAME_DUPLICATE_URL
異常信息
The producer group[xxx] has been created before, specify another name please.
原因
1)已經啟動了同名的消費者組,註冊失敗。
解決方案
1)重新命名一個新的消費者組。
2)同名的消費者組正常關閉後,又重新啟動。
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 客戶端配置
SUBSCRIPTION_GROUP_NOT_EXIST
異常信息
subscription group not exist
原因
1)消費者組或 DleayQueue 在獲取訂閱信息時出錯。
解決方案
1)確保消費者訂閱的 Topic 信息與 NameServer 中的 Topic 信息一致。
2)確保 Broker 和消費者連接到同一個 NameServer 集群。
3)確保 Topic 的隊列權限對生產者為 6 (rw-),對消費者至少為 2 (-w-)
CLIENT_SERVICE_NOT_OK
異常信息
The xxx service state not OK, maybe started once
原因
1)在同一個 JVM 中使用同一個生產者/消費者組啟動多個生產者/消費者實例,可能會導致客戶端啟動失敗。
解決方案
1)確保對於給定的生產者/消費者組 JVM,只啟動一個生產者/消費者實例。
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 上創建它。
LOAD_JSON_EXCEPTION
異常信息
readLocalOffset Exception
原因
1)廣播模式下,消費者加載 local offsets.json 檔案時出現錯誤。
2)fastjson 檔案損毀也會導致相同問題。
解決方案
1)檢查使用的 fastjson 版本與 RocketMQ 版本是否一致。
2)升級 fastjson 版本。
SAME_GROUP_DIFFERENT_TOPIC
異常信息
the consumer's group info/subscription not exist
原因 1)消費者訂閱的 Topic 資訊不存在。
解決方案
1)檢查消費者所屬的消費者群組是否存在。
2)檢查消費者訂閱的 Topic 是否存在。
MQLIST_NOT_EXIST
異常信息
Can not find Message Queue for this topic
原因 1)對生產者來說,根據 Topic 無法取得對應的佇列資訊。
解決方案
1)確保已針對 Topic 正確設定佇列資訊。
2)確保對應 Topic 的佇列至少具有 2 個 (-w-) 權限。
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 之間的連線正常。
UNKNOWN_HOST_EXCEPTION
異常信息
InetAddress java.net.InetAddress.getLocalHost() throws UnknownHostException
原因
1)主機上可能有多個網路介面,且一個介面可能繫結多個 IP 位址。
解決方案
1)確保對應主機的 IP 能正常存取,並使用 Ping 等網路指令檢查網路狀況。
5 其他
Broker 發生故障會造成什麼影響?
1)主節點發生故障
訊息無法再傳送到 Broker 集群,但如果還有其他可用的 Broker 集群,只要主題存在,訊息仍可傳送。仍可從備用節點使用訊息。
2)部分備用節點發生故障
只要還有其他可用的備用節點,傳送訊息不會受到影響。使用訊息不會受到影響,除非消費者群組設定為先從備用節點使用。預設消費者群組會從主節點使用。
3)所有備用節點發生故障
傳送訊息到主節點不會受到影響,但如果主節點是 SYNC_MASTER,生產者會收到 SLAVE_NOT_AVAILABLE 訊息,表示訊息未傳送到任何備用節點。使用訊息不會受到影響,除非消費者群組設定為先從備用節點使用。預設消費者群組會從主節點使用。