Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services DynamoDB流如何将记录分发到碎片?_Amazon Web Services_Amazon Dynamodb_Aws Lambda_Amazon Dynamodb Streams - Fatal编程技术网

Amazon web services DynamoDB流如何将记录分发到碎片?

Amazon web services DynamoDB流如何将记录分发到碎片?,amazon-web-services,amazon-dynamodb,aws-lambda,amazon-dynamodb-streams,Amazon Web Services,Amazon Dynamodb,Aws Lambda,Amazon Dynamodb Streams,我的目标是确保DynamoDB流发布的记录以“正确”的顺序进行处理。我的表包含客户的事件。散列键是事件ID,范围键是时间戳。“正确”顺序意味着相同客户ID的事件按顺序处理。不同的客户ID可以并行处理 我通过Lambda函数使用流。每个碎片自动生成消费者。因此,如果运行时决定对流进行切分,则消耗将并行进行(如果我没有弄错的话),并且在创建CustomerCreated(例如)之前,我将面临处理CustomerAddressChanged事件的风险 这意味着没有办法影响切分。但他们并没有这么明确地说

我的目标是确保DynamoDB流发布的记录以“正确”的顺序进行处理。我的表包含客户的事件。散列键是事件ID,范围键是时间戳。“正确”顺序意味着相同客户ID的事件按顺序处理。不同的客户ID可以并行处理

我通过Lambda函数使用流。每个碎片自动生成消费者。因此,如果运行时决定对流进行切分,则消耗将并行进行(如果我没有弄错的话),并且在创建CustomerCreated(例如)之前,我将面临处理CustomerAddressChanged事件的风险


这意味着没有办法影响切分。但他们并没有这么明确地说。是否有一种方法,例如,对范围键使用客户ID和时间戳的组合?

dynamodb流由分组为碎片的流记录组成。碎片可以生成子碎片,以响应dynamodb表上的大量写入。因此,您可以有父碎片,也可能有多个子碎片为确保应用程序按正确的顺序处理记录,必须始终在处理子碎片之前处理父碎片。这在中有详细说明

不幸的是,发送到AWS Lambda函数的DynamoDB Streams记录是严格序列化的,每个分片,并且不能保证记录在不同分片之间的顺序

来自AWS Lamda常见问题解答:

Q:AWS Lambda如何处理来自Amazon Kinesis流和Amazon DynamoDB流的数据?

Amazon Kinesis和DynamoDB流记录发送到您的AWS Lambda函数是严格序列化的,每个碎片。这意味着如果 你在同一个碎片里放了两张唱片,Lambda保证你的 将使用第一条记录成功调用Lambda函数 在使用第二条记录调用之前。如果调用一个 记录超时、被限制或遇到任何其他错误(Lambda) 将重试,直到成功(或记录达到24小时可用状态) 在继续下一条记录之前。排序 不保证跨不同碎片的记录,并且 每个碎片并行发生

如果使用DynamoDB Streams Kinesis适配器,应用程序将根据DynamoDB文档以正确的顺序处理碎片和流记录。有关DynamoDB Streams Kinesis适配器的更多信息,请参阅


因此,使用dynamodb lambda触发器不能保证订购。您的其他选择包括使用DynamoDB Streams Kinesis适配器或需要大量工作的

分片由表键决定的假设似乎是正确的。我的解决方案是使用客户ID作为散列键,时间戳(或事件ID)作为范围键

说:

对单个数据进行的一系列更改的相对顺序 主键将保留在碎片中。此外,一个给定的密钥 将最多出现在一组兄弟碎片中的一个碎片中 在给定时间点处于活动状态。因此,您的代码可以简单地 在碎片内处理流记录,以便准确跟踪 对项目的更改


证实了这一点。我仍然希望DynamoDB文档能明确地这样说…

我刚收到AWS支持部门的回复。它似乎证实了分区映射到碎片的假设。或者按照我的理解,分区被映射到一个碎片树

我的问题是关于由于TTL过期而删除事件,但它也适用于所有其他类型的操作

  • 是否为每个主分区键创建碎片?如果同一分区中的项目太多,碎片会被分割成子分区吗

    DynamoDB表中的每个分区都会创建一个碎片。如果 由于同一分区中的项目太多,因此需要分割分区 分区时,碎片也会被拆分为子对象。碎片可能 拆分以响应其父级上的高级别写入活动 表,以便应用程序可以处理来自多个碎片的记录 同时-

  • 如果删除的100个项目都有相同的分区密钥,那么它们会被放在一个碎片中吗

    假设所有100项都具有相同的分区键值(但是 不同的排序键值),它们将存储在同一个 隔断因此,它们将从同一分区中删除 然后被放在同一块碎片里

  • 既然“发送到AWS Lambda函数的记录是严格序列化的”,那么在TTL的情况下,这种序列化是如何工作的?是 分区/排序键TTL建立的碎片内的顺序 到期日等

    DynamoDB Streams捕获项目级别的时间顺序序列 DynamoDB表中的修改。这个时间顺序是 按碎片级别保存。换句话说,在一个 碎片是根据创建项目的顺序建立的, 更新或删除-


  • 这并没有回答我的问题:记录如何分组到碎片中?@user818510您如何使用DynamoDB Streams低级API来保证排序?似乎非常小心,不要直接承认碎片之间没有保留顺序。碎片是并行处理的,因此您肯定可以并行处理完全无序的事件。这就像“这个时间顺序的序列是在每个碎片级别上保存的。”为什么他们不直接说。。。时序序列仅在每个碎片级别保留,而不是在流级别保留。