AWS Kinesis、順序が保証されたLambdaの同時処理

Aug 19 2020

Kinesis Stream Consumer(任意の数のシャード)を指すイベントソースを持つLambdaがあります

同じ「パーティションキー」を持つストリーム内のアイテムが、同時にではなく順番にLambdaによって処理されるようにしたいと思います。(これはオブジェクトのIDとして使用されており、複数のLambdaが同じオブジェクトに対して同時にロジックを実行することは望ましくありません。)

たとえば、ストリーム内のアイテムにパーティションキーがある場合:

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

処理の順序を左から右にすると、Lambdaはパーティションキー1、2、3、および4のそれぞれでアイテムを同時に処理します。次に、特定のパーティションキーを使用してアイテムを終了すると、そのキーを使用して別のアイテムの処理を開始できます。

これは、Lambdaを非効率的に使用する分散ロックを使用せずに、何らかの方法で達成できますか?

ありがとう

回答

numX Aug 20 2020 at 13:23

私は間違った方法で問題に取り組んでいたようです。Lambdaは、シャード内でLambdaインスタンスが一度に1つのバッチで呼び出されることを保証します。したがって、最悪の場合、同じバッチ内の同じエンティティに属する複数のレコードがあり、それらを順番に処理することで、Lambda関数自体のメモリ内で管理できるため、分散ロックは必要ありません。

AWSFAQからの参照 http://aws.amazon.com/lambda/faqs/

Q:AWSLambdaはAmazonKinesisストリームとAmazonDynamoDBストリームからのデータをどのように処理しますか?

AWSLambda関数に送信されるAmazonKinesisおよびDynamoDBStreamsレコードは、シャードごとに厳密にシリアル化されます。つまり、2つのレコードを同じシャードに配置した場合、Lambdaは、2番目のレコードで呼び出される前に最初のレコードでLambda関数が正常に呼び出されることを保証します。1つのレコードの呼び出しがタイムアウトしたり、抑制されたり、その他のエラーが発生した場合、Lambdaは成功するまで(またはレコードが24時間の有効期限に達するまで)再試行してから、次のレコードに進みます。異なるシャード間でのレコードの順序は保証されておらず、各シャードの処理は並行して行われます。