2014-02-19 156 views
8

我正在研究一個項目,我打算使用an Amazon SQS Delay Queue在SQS中,延遲隊列消息計爲「在飛行中」嗎?

我在理解「機上」消息的含義時有點麻煩。

有是說,文檔中的說明:

注意

有120,000限制每 隊列飛行信息的數量。消息在 隊列收到但尚未從隊列中刪除後即會在飛行中。如果達到 120,000的限制,您將收到來自Amazon SQS的OverLimit錯誤消息。爲了避免達到限制,應在隊列處理後從隊列中刪除消息 。您還可以增加用於處理消息的隊列數量 。

但我不完全確定什麼被視爲「被隊列接收」。在流程圖中,隊列中的「收到」消息在哪裏?

enter image description here

我將有很多故意延遲(在該圖的第一藍色條),但在「可見性超時」階段(第二藍色條)不是很多消息。

兩個藍色條都算作「飛行」消息嗎?或者在「ReceiveMessage」請求(在圖表底部的「返回消息」右側)「接收」之後,它只是「飛行中」的消息?

回答

9

丟棄到延遲隊列中的郵件不會立即計爲「正在運行」,因爲它們對於任何使用者都是不可見的。它們不被視爲「可用」或「在飛行中」,它們只是對您不可見。

您可以使用AWS SQS控制檯上的一個簡單的實驗驗證這一點:

  • 創建一個延遲隊列,並有兩個選項卡中打開的SQS控制檯。
  • 右鍵單擊隊列並選擇「發送消息」,將幾條消息拖放到延遲隊列中 - 您應該注意到這些消息在延遲到期之前不會被計爲「可用」或「在飛行中」點他們成爲「可用」。

正如文檔所述,郵件在收到(在某些應用程序正在處理它們的同時)但在刪除之前是「正在運行」。如果在應用程序完成時它們沒有被刪除,它們將返回到「可用」狀態。

您可以使用AWS SQS控制檯上第二個實驗中驗證這一點:

  • 打開兩個選項卡AWS SQS控制檯。在延遲隊列中創建一些消息並等待它們變爲可用。
  • 在您的第一個選項卡中,右鍵單擊隊列並選擇「查看/刪除消息」。在此實驗中,「查看/刪除消息」對話框類似於您的應用程序 - 它正在查看它時正在處理隊列消息。將「消息輪詢隊列」文本字段設置爲足夠長的時間並開始輪詢消息。如果您的消息可用,則應立即顯示。
  • 在第二個選項卡中,刷新SQS控制檯。您應該注意到這些消息現在處於「正在運行」狀態,因爲在另一個選項卡中查看消息時收到了消息。

由於您的「飛行中」消息是目前正在由您的應用程序處理的消息,因此該列中的隊列消息深度不應該實際增長得非常大。在處理它們之後刪除你的消息(或者重試 - >適當的處理,然後刪除/移動到另一個隊列來處理異常),你應該沒問題。