本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon SQS FIFO 队列和 Lambda 并发行为
通过将 FIFO(先进先出)队列与 Lambda 结合使用,您可以确保每个消息组内消息的有序处理。Lambda 函数不会同时为同一个消息组运行多个实例,从而保证消息处理的顺序。但是,它可以纵向扩展以并行处理多个消息组,从而确保高效处理队列的工作负载。以下几点描述了 Lambda 函数在处理来自 Amazon SQS FIFO 队列的消息时与消息组 ID 相关的行为:
-
每个消息组对应单个实例:在任何时候,只有一个 Lambda 实例会处理来自特定消息组 ID 的消息。这样可以确保同一组内的消息按照顺序处理,从而保持 FIFO 顺序的完整性。
-
不同消息组的并行处理:Lambda 可以使用多个实例同时处理来自不同消息组 ID 的消息。这意味着,当 Lambda 函数的一个实例处理来自某个消息组 ID 的消息时,其他实例可以同时处理来自其他消息组 ID 的消息,从而利用 Lambda 的并发功能并行处理多个消息组。
FIFO 队列消息分组
FIFO 队列可以确保严格按照消息的发送顺序对其进行处理。它们使用消息组 ID 对需要按顺序处理的消息进行分组。
同一消息组中的消息按顺序处理,并且系统每次仅处理每个消息组中的一条消息,以便保持该顺序。
Lambda 与 FIFO 队列的并发处理
创建队列后,您可以向该队列发送消息。
当您设置 Lambda 函数来处理来自 Amazon SQS FIFO 队列的消息时,Lambda 会遵守 FIFO 队列提供的顺序保证。以下几点描述了在使用消息组 ID 时,Lambda 函数在处理来自 Amazon SQS FIFO 队列的消息时的并发性和扩展性表现:
-
消息组内的并发性:一次只有一个 Lambda 实例处理某个特定消息组 ID 的消息。这样可以确保同一组内的消息按照顺序处理。
-
扩展性和多个消息组:虽然 Lambda 可以纵向扩展以并发处理消息,但这种扩展是针对不同的消息组进行的。如果您有多个消息组,Lambda 可以并行处理多个消息组,每个消息组由单独的 Lambda 实例处理。
有关更多信息,请参阅《Amazon Lambda Operator Guide》中的 Scaling and concurrency in Lambda。
使用案例示例
假设您的 FIFO 队列收到具有相同消息组 ID 的消息,并且您的 Lambda 函数具有较高的并发限制(最多 1000 条)。
如果系统正在处理来自消息组 ID“A”的一条消息,而来自消息组 ID“A”的另一条消息到达,则在第一条消息完全处理完毕之前,第二条消息不会触发新的 Lambda 实例。
但是,如果来自消息组 ID“A”和消息组 ID“B”的消息同时到达,则这两条消息可以由不同的 Lambda 实例并发处理。