AWS Kinesis,具有保证顺序的并发 Lambda 处理

AWS Kinesis, concurrent Lambda processing with a guaranteed ordering

我有一个 Lambda,其事件源指向 Kinesis 流消费者(具有任意数量的分片)

我想确保流中具有相同 'partition key' 的项目由 Lambda 按顺序处理,而不是同时处理。 (这被用作对象的标识,我不希望多个 Lambdas 同时对同一个对象执行逻辑。)

例如,如果流中的项目具有分区键:

1,2,1,3,4,1,2,1

如果我们采用从左到右的处理顺序,Lambda 将同时处理具有每个分区键 1、2、3 和 4 的项目。然后,当它完成具有特定分区键的项目时,它可以开始处理具有该键的另一个项目。

如果不使用会降低 Lambda 使用效率的分布式锁,这是否可以通过某种方式实现?

谢谢

看来我处理问题的方式不对。 Lambda 保证在一个分片内,一次在一个批次上调用 Lambda 实例。因此,不需要分布式锁,因为在最坏的情况下,同一批次中会有多个属于同一实体的记录,并且可以在 Lambda 函数本身内管理 in-memory 按顺序处理它们。

参考自 AWS 常见问题 http://aws.amazon.com/lambda/faqs/

Q: How does AWS Lambda process data from Amazon Kinesis streams and Amazon DynamoDB Streams?

The Amazon Kinesis and DynamoDB Streams records sent to your AWS Lambda function are strictly serialized, per shard. This means that if you put two records in the same shard, Lambda guarantees that your Lambda function will be successfully invoked with the first record before it is invoked with the second record. If the invocation for one record times out, is throttled, or encounters any other error, Lambda will retry until it succeeds (or the record reaches its 24-hour expiration) before moving on to the next record. The ordering of records across different shards is not guaranteed, and processing of each shard happens in parallel.

具有相同'partition key'的项目将由Lambda按顺序处理以进行流事件源映射。

此外,您可以在创建 Lambda 触发器时指定 'concurrent batches per shard':

  1. 如果 'concurrent batches per shard' 为 1(默认一个),则整个分片的顺序将被保留。
  2. 如果 'concurrent batches per shard' 为 [2;10],则只会为分片中具有相同分区键的记录保留顺序。

您可以查看并发批处理 (ParallelizationFactor) in https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html