簡體   English   中英

AWS Lambda + SQS,一次處理整個隊列

[英]AWS Lambda + SQS, processing whole queue at once

我有一個SQS隊列,它不斷接收消息。 我也有正在處理隊列的NodeJS Lambda。 處理應該定期進行,但很少,例如每天兩次。 正在處理隊列的Lambda正在單批處理隊列中的內容,並且重要的是它在開始處理時可以處理隊列的全部內容。

從隊列中獲取一條消息很簡單。 這是異步操作,我可以將其放入promise中,並在promise解決后處理消息。

現在的問題是如何處理完整隊列? 我應該循環直到隊列為空,但是由於該操作是異步的,所以我不知道何時結束循環。 我可以看到一些相當丑陋的解決方案。 就像我在異步操作的回調中更新一些stop變量,並在更新后停止循環一樣,但這聽起來並不理想。 我將需要設置一些讀取延遲,以免不必要的讀取操作轟炸隊列。

有什么堅實的解決方案呢?

如果我對您的問題很了解,那么您的Lambda計划每天(兩次左右)運行兩次,並且當它運行時,您希望它處理SQS隊列中的所有消息。

您不想等待消息,而是直接使用SQS隊列中的現有消息(+您的Lambda不允許運行超過300 s),因此我將進行短輪詢而不是長輪詢 ,設置WaitTimeSeconds=0 然后可以設置MaxNumberOfMessages=10 (允許的最大值),但是由於短輪詢中的receiveMessage僅請求所有SQS主機的一個子集,因此不能保證通過一次調用就可以使所有消息真正坐在隊列中(即使少於10)。

因此,我將編寫代碼並跟蹤對receiveMessage的連續調用的數量,這些調用根本不返回任何消息。 如果來自receiveMessage的新回調返回任何消息,請重置此計數器,然后重新開始。 一旦數字達到您選擇的閾值(您可以憑經驗定義,我會從10開始),您的腳本會認為隊列中實際上沒有消息並退出。

您可能會幫助一些便捷的方法來減輕回調語法,例如在此處的 receiveMessages

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM