本文介紹了當MNS刪除消息時返回“message not exist”的問題描述、問題原因和解決方案。

問題描述

消息服務MNS中刪除消息時報如下錯誤。
message not exist

問題原因

VisibilityTimeout到期,該消息的ReceiptHandle失效,導致消息刪除失敗。詳細過程如下:

  • 當消息被消費端接收,消息狀態從active變為inactive。
  • inactive狀態將持續VisibilityTimeout的時間。在這段時間里,用戶可以刪除這條消息。
  • VisibilityTimeout到期后,消息狀態將從inactive變回為active,消息可繼續被其他消費端消費,該消息的 ReceiptHandle隨之失效。
  • 如果使用已經失效的ReceiptHandle去刪除消息,系統將返回“message not exist”的錯誤。

解決方案

檢查隊列屬性VisibilityTimeout的大小,設置一個合適的值,下次接收到消息時,再刪除消息。關于該參數大小的調整,請注意如下兩點:

  • 如果VisibilityTimeout設置得太小,當來不及刪除消息時,會導致“message not exist”錯誤。
  • 如果VisibilityTimeout設置得太大,當消息處理失敗時,將不能在短時間內再次處理該條消息。