2011-05-26 134 views

回答

8

Azure隊列不確保消息順序和消息唯一性。消息將被處理「至少一次」,但沒有確保它不會被處理兩次,所以它不能確保「最多一次」。

你應該準備好接收兩次相同的消息。您可以將消息正文中的ID作爲數據的一部分。

11

vtortola幾乎涵蓋了它,但我想添加一點更多的細節,爲什麼它是至少一次交付。

當您讀取隊列項目時,它不會從隊列中移除;相反,它變得不可見但留在隊列中。該隱身期默認爲30秒(最長2小時)。在此期間,將項目從隊列中取出的代碼有足夠的時間處理隊列消息中的任何命令並刪除隊列項目。

假設隊列項目在超時時間到達之前被刪除,一切都很好。但是:一旦達到超時期限,隊列項目就會再次變爲可見,並且持有隊列項目的代碼可能不再刪除它。在這種情況下,其他人可以讀取相同的隊列消息並重新處理該消息。

因爲事實隊列消息可以超時,並能重新出現:

  • 您的隊列處理必須冪等 - 隊列上的消息操作必須產生相同的結果(如渲染照片的縮略圖)。
  • 您需要考慮超時調整。您可能會發現命令是有效的,但處理時間過長(也許您的45秒縮略圖渲染代碼工作得很好,直到有人上傳25MP圖像爲止)
  • 您需要考慮有毒消息 - 那些永遠不會正確處理的消息。也許它們會導致拋出異常或導致消息處理器中止處理的一些無效條件,從而導致消息最終重新出現在隊列中。有一個屬性調用DequeueCount - 考慮在閱讀隊列項目時查看該屬性,如果等於比如說3,則將消息推送到表或Blob中,並向自己發送通知,以便花費一些時間在離線狀態下調試該消息。

有關獲取隊列低級別REST API的更多詳細信息,請參閱here。這會讓您更深入地瞭解Windows Azure隊列消息處理。