2017-07-04 102 views
1

我有一個FIFO SQS隊列,可見時間爲30秒。 需求是儘可能快地讀取消息並清除隊列。Amazon SQS - FIFO隊列消息請求,不一致接收

我有代碼在JAVA在以下所示的方式(這僅僅是一個想法的表示只,而不是完整的代碼):

//keep getting messages from FIFO and process them ASAP 
while(true) 
{ 
    List<Message> messages = 
    sqsclient.receiveMessage(receiveMessageRequest).getMessages(); 
    //my logic/code here to process these messages and delete them ASAP 
} 

在一旦消息被接收到的while循環中,他們被處理並從隊列中刪除。 但是,很多次 receiveMessageRequest不給我消息(返回零消息)。

此外,從SQS接收時,消息限制僅爲10次,這已經是一個問題,但由於這些零接收,隊列堆積如山。

我不知道爲什麼會發生這種情況。該部分的文檔完全不清楚(或者我是否缺少隊列配置?)

請幫忙!

注: 1.我的FIFO隊列總是具有在這種情況下的消息,所以沒有具有零消息和接收請求返回零

2.處理和刪除時間也隊列的情況下小於可見性超時。

謝謝。

更新: 我已經開始運行多個用戶來處理FIFO隊列。顯然,一個消費者沒有處理消息的流入。我將在幾天內更新多個消費者的表現。謝謝

+0

您是否考慮過使用多個線程/客戶端來並行使用消息?您可能會達到FIFO隊列每秒300個事務(TPS)的限制嗎?您是否考慮過使用**長輪詢**(接收消息等待時間),它只會在指定的時間段(例如20秒)後返回零消息響應? –

+0

@John感謝您的回覆。 是的。我已經嘗試了長時間投票,類似的行爲。即使隊列中有超過5000條消息,它並不總是讓我發送消息。 我現在正嘗試多個消費者。但我想大致瞭解行爲 –

+0

目前有多少條消息顯示爲**正在飛行**?先進先出隊列要求您正確處理每封郵件,如果不正確,他們將顯示「正在運行」,並且 - 在設計上 - SQS會等待您對其採取行動或其可見性超時過期。檢查這個? –

回答

0

您必須首先確保您收到的所有消息都在VisibilityTimeout中刪除。如果您使用DeleteMessageBatch進行刪除,請確保刪除所有10條消息。

另外,你排隊時如何排隊消息? 消息的順序僅在單個消息組中保證。 這也意味着如果您爲所有消息設置相同的組ID,則僅限於單個使用者,以便確保消息的順序。即使使用多個消費者,在可見性超時過期之前,屬於同一組的所有消息都對其他消費者不可見。