

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 实施 Lambda 事件筛选的最佳实践
<a name="best-practices-event-filtering"></a>

以下是[为 Amazon SQS 事件源配置 Lambda 事件筛选](https://aws.amazon.com//about-aws/whats-new/2021/11/aws-lambda-event-filtering-amazon-sqs-dynamodb-kinesis-sources/)的最佳实践：
+ 熟悉 [Lambda 服务的筛选规则语法](https://docs.aws.amazon.com//lambda/latest/dg/invocation-eventfiltering.html#filtering-syntax)，特别是 [Lambda 用于 Amazon SQS 的筛选规则语法](https://docs.aws.amazon.com//lambda/latest/dg/invocation-eventfiltering.html#filtering-sqs)。然后，根据您的业务逻辑设计事件筛选条件。任何事件筛选条件的有效性都取决于它仅在应该调用 Lambda 函数时才调用它的能力。为此，必须对筛选规则应用正确的语法，以使规则反映应用程序业务逻辑的需求。
+ 在应用程序的业务逻辑需要一系列更复杂的筛选条件的情况下，请确保使用多级筛选。有关更多信息和示例数据对象，请参阅 *AWS Lambda Developer Guide* 中的 [Multi-level filtering](https://docs.aws.amazon.com//lambda/latest/dg/invocation-eventfiltering.html#multi-level-filtering)。
+ 通过在 Amazon SQS 请求参数中定义**MessageRetentionPeriod**值，限制您希望 Amazon SQS 将未处理的消息保留多长时间。通过确定处理一条有效消息通常需要多长时间，确保您定义的值符合应用程序的用例。有关更多信息，请参阅[SetQueueAttributes](https://docs.aws.amazon.com//AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)《*亚马逊 SQS API* 参考》。另请参阅本指南的 [Avoiding non-matching message accumulation](#avoiding-non-matching-message-accumulation) 部分。
+ 在 Lambda 函数不可用而导致无法处理有效消息的情况下，配置 Amazon SQS 死信队列。这个额外的 Amazon SQS 队列有助于避免在无服务器应用程序的架构中产生 snowball 反模式。有关更多信息，请参阅本指南的 [Avoiding snowball anti-patterns](best-practices-partial-batch-responses.md#snowball-anti-patterns)。
+ 确保在 Lambda 服务上激活事件筛选条件功能。在最初创建 Lambda 函数时，必须激活该功能。有关说明，请参阅 *AWS Lambda Developer Guide* 中的 [Attaching filter criteria to an event source mapping (console)](https://docs.aws.amazon.com//lambda/latest/dg/invocation-eventfiltering.html#filtering-console) 或 [Attaching filter criteria to an event source mapping (AWS CLI)](https://docs.aws.amazon.com//lambda/latest/dg/invocation-eventfiltering.html#filtering-cli)。

## 避免不匹配的消息累积
<a name="avoiding-non-matching-message-accumulation"></a>

如果事件筛选条件设计不当，大量不相关的消息很快就会淹没 Lambda 函数的 Amazon SQS 队列。在这种情况下，Lambda 函数会处理初始消息批处理中的所有消息，即使其中只有很少的消息是相关的。虽然函数需要更长的时间来处理其他不相关的消息，但会将更多不相关的消息添加到 Amazon SQS 队列中。除非配置了**MessageRetentionPeriod**参数，否则这些新消息会导致该函数需要更长的时间来处理下一个消息批次。随着时间的推移，源队列中不相关的消息数量会超过有效消息的数量。

该**MessageRetentionPeriod**参数限制 Amazon SQS 队列将未处理的消息保留多长时间（以秒为单位）。例如，如果**MessageRetentionPeriod**值为 3,600 秒，则在一小时后将所有未处理的消息从队列中删除。

有关说明，请参阅[SetQueueAttributes](https://docs.aws.amazon.com//AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)《*亚马逊 SQS API* 参考》。