

# 为 SQS 事件源映射配置扩展行为
<a name="services-sqs-scaling"></a>

您可以通过最大并发数设置或者启用预置模式来控制您的 Amazon SQS 事件源映射的扩展行为。它们是互斥选项。

默认情况下，Lambda 会根据消息量自动扩展事件轮询器。启用预置模式时，您可以分配最小和最大数量的专用轮询资源，这些资源随时可以处理预期的流量模式。这使您可以通过两种方式优化事件源映射的性能：
+ 标准模式（默认）：Lambda 会自动管理扩展，从少量轮询器开始，然后再根据工作负载纵向扩展或缩减。
+ 预置模式：您可以通过设置最小和最大限制配置专用轮询资源，从而使扩展速度加快 3 倍，处理容量最多提高 16 倍。

对于标准队列，Lambda 使用[长轮询](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html#sqs-long-polling)来轮询一个队列，直到它变为活动状态。当消息可用时，Lambda 会通过函数的五次并发调用开始一次处理五个批次。如果仍有消息可用，则 Lambda 增加批量读取的进程数，最多每分钟增加 300 次并发调用。事件源映射可以同时处理的最大调用数量为 1250。当流量较低时，Lambda 会将处理规模缩减为 5 个并发调用，并且可优化为少至 2 个并发调用，以减少 Amazon SQS 调用和相应的成本。但是，当您启用最大并发设置时，此优化不可用。

对于 FIFO 队列，Lambda 按照接收消息的顺序向函数发送消息。向 FIFO 队列发送消息时，需要指定[消息组 ID](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html)。Amazon SQS 确保同一组中的消息按顺序传递到 Lambda。当 Lambda 按批次读取消息时，每个批次可能包含来自多个消息组的消息，但消息的顺序保持不变。如果函数返回错误，函数会对受影响的消息尝试所有重试，然后 Lambda 才会接收来自同一个组的其他消息。

使用预置模式时，每个事件轮询器能处理最高 1 MB/秒的吞吐量、最多 10 次并发调用，或者每秒最多进行 10 次 Amazon SQS 轮询 API 调用。Lambda 会根据您所配置的最小值和最大值来扩展事件轮询器的数量，能够迅速将并发次数提升至最多每分钟 1000 次，从而实现对 Amazon SQS 事件的一致性低延迟处理。使用预调配模式会产生额外成本。有关详细定价，请参阅 [Amazon Lambda 定价](https://www.amazonaws.cn/lambda/pricing/)。每个事件轮询器对您的 SQS 队列使用[长轮询](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html)，每秒最多进行 10 次轮询，这会产生 SQS API 的请求费用。有关详细信息，请参阅 [Amazon SQS 定价](https://www.amazonaws.cn/sqs/pricing/ )。您可以通过这些最小和最大事件轮询器设置来控制扩展和并发情况，而非使用最大并发设置，因为这两种选项不能同时使用。

**注意**  
您不能同时使用最大并发设置和预置模式。启用预置模式后，您可以通过事件轮询器的最小和最大数量来控制 Amazon SQS 事件源映射的扩展和并发性。

## 为 Amazon SQS 事件源配置最大并发
<a name="events-sqs-max-concurrency"></a>

您可以使用最大并发设置来控制 SQS 事件源的扩展行为。请注意，启用预置模式后无法使用最大并发数。最大并发设置限制了 Amazon SQS 事件源可以调用的函数的并发实例数。最大并发属于事件源级别的设置。如果您将多个 Amazon SQS 事件源映射到一个函数，则每个事件源均可进行单独的最大并发设置。您可以使用最大并发，从而防止某个队列使用函数的所有[预留并发](configuration-concurrency.md)或[账户的其余并发限额](gettingstarted-limits.md)。在 Amazon SQS 事件源上配置最大并发不收取任何费用。

重要的是，最大并发和预留并发为两个独立的设置。不要将最大并发设置为高于函数的预留并发。配置最大并发后，请确保您的函数的预留并发大于或等于该函数上所有 Amazon SQS 事件源的最大总并发数。否则，Lambda 可能会限制您的消息。

当您账户的并发配额设置为默认值 1000 时，Amazon SQS 事件源映射可以扩展为调用最高此值的函数实例，除非您指定最大并发量。

如果您账户的默认并发配额有所增加，Lambda 可能无法调用最高达到新配额的并发函数实例。默认情况下，Lambda 可以扩展为针对 Amazon SQS 事件源映射调用最高 1250 个并发函数实例。如果这不足以满足您的应用场景，请联系 Amazon 支持人员，讨论如何提高您账户的 Amazon SQS 事件源映射并发度。

**注意**  
对于 FIFO 队列，并发调用的上限为[消息组 ID](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html) 的数量 (`messageGroupId`) 或最大并发设置，以较低者为准。例如，如果您有六个消息组 ID 并且最大并发设置为 10，则函数最多可以进行六次并发调用。

您可以在新的和现有的 Amazon SQS 事件源映射上配置最大并发。

**使用 Lambda 控制台配置最大并发**

1. 打开 Lamba 控制台的[函数页面](https://console.amazonaws.cn/lambda/home#/functions)。

1. 选择一个函数的名称。

1. 在 **Function overview**（函数概览）下，选择 **SQS**。此操作将打开 **Configuration**（配置）选项卡。

1. 选择 Amazon SQS 触发器，然后选择 **Edit**（编辑）。

1. 对于 **Maximum concurrency**（最大并发），输入 2 到 1,000 之间的数字。要关闭最大并发，将该框保留为空。

1. 选择**保存**。

**使用 Amazon Command Line Interface（Amazon CLI）配置最大并发**  
使用带 `--scaling-config` 选项的 [update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html) 命令。示例：

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --scaling-config '{"MaximumConcurrency":5}'
```

要关闭最大并发，请为 `--scaling-config` 输入一个空值：

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --scaling-config "{}"
```

**使用 Lambda API 配置最大并发**  
将 [CreateEventSourceMapping](https://docs.amazonaws.cn/lambda/latest/api/API_CreateEventSourceMapping.html) 或 [UpdateEventSourceMapping](https://docs.amazonaws.cn/lambda/latest/api/API_UpdateEventSourceMapping.html) 操作与 [ScalingConfig](https://docs.amazonaws.cn/lambda/latest/api/API_ScalingConfig.html) 对象结合使用。