我通过这篇文章说数据记录被组织成称为碎片的组,这些碎片可以被 Lambda 函数并行消费和处理。我还从 AWS webindar中找到了这些幻灯片,在幻灯片 22 中,您还可以看到 Lambda 函数并行使用不同的分片。但是我无法实现单个函数的并行执行。我创建了一个运行一分钟的简单 lambda 函数。然后我开始在 DynamoDB 中创建大量项目,期望获得大量流记录。尽管如此,我的职能还是一个接一个地开始了。
我做错了什么?
从第一篇文章中说:
由于分片具有沿袭(父分片和子分片),因此应用程序必须始终在处理子分片之前处理父分片。这将确保流记录也以正确的顺序进行处理。
然而,例如在处理Kinesis
流时,您可以通过拥有多个分片来实现并行性,因为只有在一个分片内才能保证处理记录的顺序。
旁注,按顺序触发事件是有意义的lambda
。Dynamodb
前置语境:
DaynamoDB 如何存储数据?
DynamoDB 使用分区来存储表记录。这些分区从用户中抽象出来并由 DynamoDB 团队管理。随着表中数据的增长,这些分区在内部进一步划分。
这些发电机流是怎么回事?
DynamoDB 作为数据库,为用户提供了一种检索有序变更日志的方式(可以将其视为传统数据库的跨国重播日志)。这些作为 Dynamo 表流出售。
数据如何在流中发布?
Stream 有一个分片的概念(有点类似于分区)。根据定义,分片包含有序事件。使用 dynamo 术语,流分片将包含来自某个分区的数据。
酷!.. 那么如果数据在表中增长或频繁写入会发生什么?
Dynamo 将根据 HashKey/SortKey 将记录保持在其关联分区中,直到超出阈值(如表大小和/或 RCU/WCU 计数)。dynamoDB 不会向我们分享这些阈值的确切值,尽管我们有一些关于粗略估计的文档。
当这个阈值被突破时,dynamo 分割分区并进行重新散列以将数据(在某种程度上)均匀地分布在分区中。
由于新分区已经到来,这些数据将发布到它自己的分片(映射到它的分区)
太好了,那么 Lambda 呢?那么并行处理是如何工作的。
一个 lambda 函数处理来自一个且只有一个分片的记录。因此,发电机流中存在的分片数量将决定并行运行的 lambda 函数的数量。
您可以隐约想到,# of partitions = # shards = # of parallel lambda running。