簡體   English   中英

按 SQS 消息數觸發 Lambda

[英]Trigger Lambda by number of SQS messages

我有一個 SQS,它將接收大量消息。 消息不斷進入隊列。

我有一個用例,如果隊列中的消息數量達到 X 個(例如 1,000),系統需要觸發一個事件來一次處理 1,000 個。

系統會觸發一大堆觸發器。 每個觸發器都有一千條消息。

例如,如果我們有 2300 條消息在隊列中,我們期望 3 個觸發器到 lambda 函數,前 2 個觸發器對應於 1,000 條消息,最后一個將包含 300 條消息。

我正在研究並看到 CloudWatch 警報可以連接到“NumberOfMessageReceived”上的 SQS 指標以發送到 SNS。 但我不知道如何為每 1,000 條消息配置一大塊警報。

如果 AWS 可以支持此用例或我們可以為實現此目的進行的任何定制,請告知我。

在此處輸入圖像描述

因此,在與 OP 對評論部分進行了一些澄清之后,這是我的答案(結合@ChrisPollard 的評論):

用 SQS 實現你想要的是不可能的,因為每個批次最多只能包含 10 條消息。 由於您需要一次處理 1000 條消息,這絕對是不行的。

@ChrisPollard 建議每次將新文件推送到 S3 時在 DynamoDB 中創建一條新記錄。 這是一個非常好的方法。 每次將分區鍵遞增 1 並通過DynamoDB Streams觸發 lambda。 在您的函數上,對您的分區鍵運行檢查,如果它等於 1000,則對您的 DynamoDB 表運行一個查詢,過濾最后 1000 個更新的項目(您需要在 CreatedAt 字段上使用全局二級索引)。 映射這些項目(或使用Projections )以創建僅包含必要信息的極簡 JSON。 就像是:

[
    {
     "key": "my-amazing-key",
     "bucket": "my-super-cool-bucket"
    },
    ...
]

像這樣的 JSON 只有 87 個字節長(如果你把方括號從游戲中去掉,因為它們不會重復,你就剩下 83 個字節了)。 如果將其四舍五入到 100 字節,您仍然可以成功地將其作為一個事件發送到 SQS,因為它只有大約 100KB 的數據。

然后讓一個 Lambda 函數訂閱您的 SQS 隊列,最后連接 1000 個文件。

要記住的事情:

  1. 確保您確實在 DynamoDB 中創建了 createdAt 字段。 當它達到 1000 條時,可能已經插入了新項目,所以這樣可以確保您正在閱讀預期的 1000 條項目。

  2. 在您的 Lambda 檢查中,只需運行 batchId % 1000 = 0,這樣您就不需要刪除任何內容,從而節省了 DynamoDB 操作。

  3. 注意 Lambda 的執行時間。 一次連接 1000 個文件可能需要一段時間才能運行,所以我會運行幾個測試並在其上放置 1 分鍾的開銷。 即,如果通常需要 5 分鍾,請將函數的超時設置為 6 分鍾。

如果您有新信息要分享,我很樂意編輯我的答案。

您可以在 1k、2k、3k 等處添加警報……但這似乎很笨拙。

你讓消息批量處理有什么原因嗎? 您可以使此觸發器基於事件(當添加隊列消息時觸發我的 lambda)並擺脫批處理它們的復雜性。

我最近處理了一個非常類似的情況,進程-A 將對象放入 S3 存儲桶中,每次它都會在 SQS 中放入一條消息,其中包含密鑰和存儲桶詳細信息,我有一個每小時觸發的 lambda,但它可以成為任何觸發器,例如您的雲手表警報。 以下是您可以對每個觸發器執行的操作:

  • 從隊列中讀取消息,SQS 允許您一次僅讀取 10 條消息,並且每次讀取消息時,不斷將它們添加到 lambda 中的某個列表中,您還可以獲得每條消息的收據句柄,您可以使用它刪除消息並重復此過程,直到您閱讀隊列中的所有 1000 條消息。 現在,您可以執行列表上所需的任何操作,並以多種不同方式將其提供給進程 B,例如 S3 中的文件和/或進程 B 可以讀取的新隊列。

  • 讀取消息的替代方法:SQS 允許您一次僅讀取 10 條消息,您可以發送可選參數 'VisibilityTimeout':60 將消息從隊列中隱藏 60 秒,並且您可以遞歸讀取所有消息,直到您不讀取查看隊列中的任何消息,同時將它們添加到 lambda 中的列表以處理它們,這可能很棘手,因為您必須根據讀取 1000 條消息所需的時間嘗試不同的可見性超時值。 一旦您知道您閱讀了所有消息,您就可以簡單地擁有收據句柄並刪除所有這些消息。 您也可以清除隊列,但是,您可能會刪除在此過程中進入的一些至少未閱讀一次的消息。

暫無
暫無

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

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