消息隊列是否可以在公網訪問?
暫不支持,消息的生產者和消費者需要和消息隊列所在的 region 網絡處于聯通狀態。
新創建的 Group ID 從哪里開始消費?
如果這個 Group ID 是第一次啟動,對于最近新建且消息量較少的 Topic,會從頭開始消費,所有的歷史消息有可能重復消費一遍;如果是存在時間較長的 Topic,則會忽略歷史消息,從啟動之后發送的消息開始消費。
如果這個 Group ID 是第二次啟動,那么從上次消費的位置開始消費。
如果想從特定位置開始消費,可以通過消息隊列控制臺的消費位點重置功能,指定到具體的時間開始消費。每次重置只針對特定 Group ID 下的特定 Topic,不會影響其他 Group ID。
消息隊列消費失敗如何重新消費消息?
集群消費方式
消費業務邏輯代碼如果返回
Action.ReconsumerLater
,或者 NULL,或者拋出異常,消息都會走重試流程,最多重試 16 次。如果重試 16 次后,仍然失敗,則消息丟棄。您可以通過調用message.getReconsumeTimes()
方法來獲取消息的重試次數。每次重試的間隔時間如下:
第幾次重試
每次重試間隔時間
1
10 秒
2
30 秒
3
1 分鐘
4
2 分鐘
5
3 分鐘
6
4 分鐘
7
5 分鐘
8
6 分鐘
9
7 分鐘
10
8 分鐘
11
9 分鐘
12
10 分鐘
13
20 分鐘
14
30 分鐘
15
1 小時
16
2 小時
廣播消費方式
廣播消費方式可以保證一條消息至少被消費一次,但消費失敗后不做重試操作。
消息發送了,但是沒有收到怎么辦?
消息隊列提供了多種 消息查詢 方式:
使用 Topic 按時間范圍進行消息查詢,可以查詢到一段時間內某 Topic 收到的所有消息。
使用 Topic 和 Message ID 對消息進行精準查詢。
使用 Topic 和 Message Key 較為精準地查詢具有相同 Message Key 的一類消息。
上述方式可以查詢到消息的具體內容以及消費情況,如果需要追蹤一條消息從生產者發出到被消費者消費的整個鏈路中各個相關節點的時間地點,可以使用消息隊列最新的消息軌跡查詢功能,具體使用方式請參考 查詢消息軌跡。
消息隊列是否能保證消息不重復?
絕大多數情況下,消息是不重復的。作為一款分布式消息中間件,在網絡抖動、應用處理超時等異常情況下,可以保證消息不丟失,但是無法保證消息不重復。
控制臺顯示的消息堆積量是否包含了 Topic 下所有 Tag 的消息?
是。
消息生產者將所有類型的 Tag 都發送至同一個 Topic 中,消息按照先后順序在隊列中排列,并維護一個消息寫入位點;Group ID 啟動時會指明需要訂閱的 Tag,并從服務端獲取當前的消費位點;服務端從當前 Group ID 的消費位點開始遍歷隊列中的消息,判斷如果消息的 Tag 符合 Group ID 訂閱的 Tag 即投遞給 Group ID,不符合則跳過該消息。
如下圖所示,Group ID 消費位點往前移動,Tag2、Tag3 的消息會在服務端被過濾掉,Tag1 的消息為 Group ID 所需要的,會投遞給 Group ID。
因此消費者狀態頁面顯示的消費堆積量是未被過濾的堆積總量,包含了所有 Tag 的消息量。