

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

# Amazon Simple Queue Service 作為 EventBridge 管道中的來源
<a name="eb-pipes-sqs"></a>

您可以使用 EventBridge 管道來接收來自 Amazon SQS 佇列的記錄。然後，您可以選擇性地篩選或增強這些記錄，然後再將其傳送至可用的目的地進行處理。

您可以使用管道處理 Amazon Simple Queue Service (Amazon SQS) 佇列中的訊息。EventBridge 管道支援[標準佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues.html)和[先進先出 (FIFO) 佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html)。使用 Amazon SQS 時，您可以藉由將任務傳送到佇列並進行非同步處理，以從應用程式中的一個元件中卸載任務。

EventBridge 輪詢佇列並使用包含佇列訊息的事件同步調用管道。EventBridge 會以批次讀取訊息，並為每個批次調用一次管道。當您的管道成功處理批次時，EventBridge 會從佇列中刪除其訊息。

依預設，EventBridge 會同時輪詢佇列中最多 10 則訊息，並將該批次傳送給管道。為避免調用具有少量記錄的管道，您可設定批次間隔，要求事件來源緩衝記錄最長達五分鐘。在調用管道之前，EventBridge 會繼續輪詢來自 Amazon SQS 標準佇列的訊息，直到發生下列其中一種情況為止：
+ 批次化視窗即會到期。
+ 已達到調用有效負載大小配額。
+ 已達到批次大小可設定的上限。

**注意**  
如果您使用的是批次時間範圍，並且您的 SQS 佇列包含低的流量，EventBridge 可能會等到 20 秒，然後再調用您的函數。即使您將批次時間範圍設定為低於 20 秒也是如此。對於 FIFO 佇列，記錄包含與重複資料刪除和定序相關的其他屬性。

當 EventBridge 讀取批次時，訊息會留在佇列中，但是在佇列的[可見性逾時](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html)期間會變成隱藏狀態。如果您的管道成功處理批次，EventBridge 會從佇列中刪除訊息。根據預設，如果管道在處理批次時遇到錯誤，則該批次中的所有訊息會再次顯示在佇列中。因此，您的管道程式碼必須能夠多次處理相同的訊息，而不會產生副作用。您可以在管道回應中包含批次項目失敗的資訊，以便修改此重新處理行為。下列範例顯示兩則訊息之批次的事件。

**範例事件**

下列範例事件顯示管道接收的資訊。您可以使用此事件來建立和篩選事件模式，或定義輸入轉換。並非所有欄位都可以篩選。如需有關所能篩選欄位的詳細資訊，請參閱 [Amazon EventBridge 管道中的事件篩選](eb-pipes-event-filtering.md)。

**標準佇列**

```
[
  {
    "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
    "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
    "body": "Test message.",
    "attributes": {
      "ApproximateReceiveCount": "1",
      "SentTimestamp": "1545082649183",
      "SenderId": "AIDAIENQZJOLO23YVJ4VO",
      "ApproximateFirstReceiveTimestamp": "1545082649185"
    },
    "messageAttributes": {},
    "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"
  }
]
```

**FIFO 佇列**

```
[
  {
    "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"
  }
]
```

## 擴展和處理
<a name="pipes-sqs-scaling"></a>

針對標準佇列，EventBridge 會使用[長輪詢](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html)來輪詢佇列，直到其處於作用中狀態為止。當訊息可用時，EventBridge 會讀取最多五個批次，並將其傳送到您的管道。如果訊息仍然可用，EventBridge 會將讀取批次的程序數量增加最多每分鐘 300 個執行個體。一個管道可同時處理的批次數量上限為 1,000。

針對 FIFO 佇列，EventBridge 會按照其接收的順序傳送訊息到您的管道。當您傳送訊息到 FIFO 佇列時，您可以指定[訊息群組 ID](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html)。Amazon SQS 有助於依序將相同群組中的訊息傳遞給 EventBridge。EventBridge 會將訊息分成群組，並且一次只傳送一個群組的一個批次。如果您的管道傳回錯誤，管道會先在受影響的訊息上嘗試所有重試，之後 EventBridge 才會從相同群組接收到額外訊息。

## 配置要搭配 EventBridge 接管使用的佇列
<a name="pipes-sqs-configure-queue"></a>

[建立 Amazon SQS 佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-create-queue.html)來做為您管道的來源。然後設定佇列以允許您的管道能夠有處理每個事件批次的時間，也讓 EventBridge 在縱向擴展時可重新行嘗試限流錯誤。

為讓您的管道有時間處理每個記錄批次，請將來源佇列的可見性逾時設定為管道擴充程序和目標元件合併執行期的至少六倍。萬一您的函數在處理前一個批次時遭到限流，額外的時間可允許 EventBridge 重試。

如果函數多次處理訊息失敗，Amazon SQS 可將訊息傳送到[無效字母佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)。當管道返回一個錯誤時，EventBridge 會將其留在佇列中。發生可見性逾時之後，EventBridge 會再次收到訊息。若要在多次接收後將訊息傳送至第二個佇列，請在來源佇列上設定無效字母佇列。

**注意**  
請確定在來源佇列上設定無效字母佇列，而不是在管道上。您在管道上設定的無效字母佇列用於佇列的非同步調用佇列，而不是事件來源佇列。

如果您的管道因為以達到並行上限而傳回錯誤或無法調用，可能可以透過進行額外的嘗試來使處理成功。若要讓訊息在傳送到無效字母佇列前更有機會受到處理，請將來源佇列再驅動政策上的 `maxReceiveCount` 設置值至少為 **5**。

## 報告批次項目失敗
<a name="pipes-sqs-batch-failures"></a>

EventBridge 取用和處理來源的串流資料時，依預設，只有在批次成功完成時，其檢查點才會到批次的最高序號。若要避免重新處理失敗批次中成功處理過的訊息，您可以設定擴充或目標，傳回哪些訊息成功，哪些失敗的物件。我們將其稱為部分批次回應。

如需詳細資訊，請參閱[部分批次失敗](eb-pipes-batching-concurrency.md#pipes-partial-batch-failure)。

### 成功與失敗條件
<a name="pipes-sqs-batch-failures-conditions"></a>

如果您傳回下列任一項目，EventBridge 會將批次視為完全成功：
+ 空白 `batchItemFailure` 清單
+ Null `batchItemFailure` 清單
+ 空白 `EventResponse`
+ Null `EventResponse`

如果您傳回下列任一項目，EventBridge 會將批次視為完全失敗：
+ 空白字串 `itemIdentifier`
+ Null `itemIdentifier`
+ 具有錯誤金鑰名稱的 `itemIdentifier`

EventBridge 會根據您的重試策略來重試失敗。