搭配 Amazon SQS 使用 Lambda - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

搭配 Amazon SQS 使用 Lambda

注意

如要將資料傳送到 Lambda 函數以外的目標,或在傳送資料之前讓資料更豐富,請參閱 Amazon EventBridge Pipes

您可以使用 Lambda 函數處理 Amazon Simple Queue Service (Amazon SQS) 佇列中的訊息。Lambda 事件來源映射既支援標準佇列,也支援先進先出 (FIFO) 佇列。Lambda 函數和 Amazon SQS 佇列必須位於相同的 AWS 區域,但可以位於不同的 AWS 帳戶

了解 Amazon SQS 事件來源映射的輪詢和批次處理行為

使用 Amazon SQS 事件來源映射時,Lambda 會輪詢佇列,並在出現事件時同步調用函數。每個事件可以包含佇列中的一批訊息。Lambda 一次接收一個批次的這些事件,並為每個批次調用函數一次。當您的函數成功處理批次時,Lambda 會從佇列中刪除其訊息。

當 Lambda 接收到一個批次時,訊息會留在佇列中,但是在佇列的可見性逾時期間會變成隱藏。如果您的函數成功處理批次中的全部訊息,Lambda 會從佇列中刪除訊息。根據預設,如果函數在處理批次時遇到錯誤,則該批次中的所有訊息會在可見性逾時時間到了之後再次顯示在佇列中。因此,您的函數程式碼必須能夠多次處理相同的訊息,而不會產生副作用。

警告

Lambda 事件來源映射至少會處理每個事件一次,而且可能會重複處理記錄。為避免與重複事件相關的潛在問題,強烈建議您讓函數程式碼具有等冪性。如需詳細資訊,請參閱 AWS 知識中心中的如何讓 Lambda 函數具有冪等性

若要防止 Lambda 多次處理訊息,您可以設定事件來源映射,在函數回應中包含批次項目失敗,或者可以使用 DeleteMessage API 動作,在 Lambda 函數成功處理訊息時從佇列中移除訊息。

如需 Lambda 支援用於 SQS 事件來源映射的組態參數的詳細資訊,請參閱建立 SQS 事件來源映射

標準佇列訊息事件範例

範例 Amazon SQS 訊息事件 (標準佇列)
{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": { "myAttribute": { "stringValue": "myValue", "stringListValues": [], "binaryListValues": [], "dataType": 'String' } }, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" }, { "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082650636", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082650649" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" } ] }

依預設,Lambda 會一次輪詢佇列中最多 10 則訊息,並將該批次傳送給函數。為避免調用具有少量記錄的函數,您可設定批次間隔,讓事件來源緩衝記錄最長達五分鐘。調用函數之前,Lambda 會繼續從標準佇列輪詢訊息,直至批次間隔到期、達到調用承載大小配額,或達到設定的批次大小上限為止。

如果您使用的是批次時間範圍,並且您的 SQS 佇列包含非常低的流量,Lambda 可能會等到 20 秒,然後再調用您的函數。即使您將批次時間範圍設定為低於 20 秒也是如此。

注意

在 Java 中,還原序列化 JSON 時可能會遇到 null 指標錯誤。這可能是由於 JSON 物件映射器對「Records」和「eventSourceARN」案例轉換的方式所致。

FIFO 佇列訊息事件範例

對於 FIFO 佇列,記錄包含與重複資料刪除和定序相關的其他屬性。

範例 Amazon SQS 訊息事件 (FIFO 佇列)
{ "Records": [ { "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5", "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1573251510774", "SequenceNumber": "18849496460467696128", "MessageGroupId": "1", "SenderId": "AIDAIO23YVJENQZJOL4VO", "MessageDeduplicationId": "1", "ApproximateFirstReceiveTimestamp": "1573251510774" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo", "awsRegion": "us-east-2" } ] }