DynamoDB流如何将记录分发到分片?

时间:2017-05-30 15:45:51

标签: amazon-web-services amazon-dynamodb aws-lambda amazon-dynamodb-streams

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

我正在通过Lambda函数使用流。每个碎片自动生成消费者。因此,如果运行时决定对流进行分片,则消耗并行发生(如果我这样做)并且我冒着在CustomerCreated之前处理CustomerAddressChanged事件的风险(例如)。

docs暗示无法影响分片。但他们并没有这么明确地说。有没有办法,例如,通过使用范围密钥的客户ID和时间戳的组合?

3 个答案:

答案 0 :(得分:4)

通过表键确定分片的假设似乎是正确的。我的解决方案是将客户ID用作哈希键,将时间戳(或事件ID)用作范围键。

This AWS blog说:

  

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

This slide证实了这一点。我仍然希望DynamoDB文档明确地说出来......

答案 1 :(得分:1)

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

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

来自AWS Lamda常见问题解答:

  

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

     

发送到您的AWS的Amazon Kinesis和DynamoDB Streams记录   每个分片严格序列化Lambda函数。这意味着如果   你把两个记录放在同一个碎片中,Lambda保证你的   将使用第一个记录成功调用Lambda函数   在使用第二条记录调用它之前。如果调用一个   记录超时,受限制或遇到任何其他错误,Lambda   将重试,直到成功(或记录达到24小时   到期之前)转到下一条记录。订购   不保证跨越不同分片的记录和处理   每个分片并行发生。

如果您使用DynamoDB Streams Kinesis Adapter,您的应用程序将根据DynamoDB文档here以正确的顺序处理分片和流记录。有关DynamoDB Streams Kinesis Adapter的更多信息,请参阅Using the DynamoDB Streams Kinesis Adapter to Process Stream Records

因此,使用dynamodb lambda触发器不能保证订购。您的其他选择包括使用DynamoDB Streams Kinesis适配器或DynamoDB Streams Low-Level API,这是一项更多的工作。

答案 2 :(得分:1)

我刚刚得到AWS支持的回复。似乎证实了@EagleBeak关于分区映射到分片的假设。或据我了解,分区映射到碎片树。

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

  
      
  1. 是否为每个主分区键创建了一个分片?然后如果同一分区中的项目太多,则分片将被拆分为子级?

         
        

    在DynamoDB表中的每个分区上创建一个碎片。如果一个     由于同一项目太多,因此需要分区分割     分区时,分片也分为子级。碎片可能     拆分以响应其父级上的高级别写活动     表,以便应用程序可以处理来自多个分片的记录     在平行下。 --     https://aws.amazon.com/blogs/database/dynamodb-streams-use-cases-and-design-patterns/

                
  2.   
  3. 如果所有已删除的100个项目都具有相同的分区键,那么它们是否会放在一个碎片中?

         
        

    假定所有100个项目都具有相同的分区键值(但     不同的排序键值),它们将存储在相同的位置     划分。因此,它们将从同一分区中删除     并放在同一碎片中。

      
  4.   
  5. 由于“发送给您的AWS Lambda函数的记录已严格序列化”,因此在TTL的情况下,此序列化如何工作?是   由分区/排序键TTL建立的分片内的顺序   到期等?

         
        

    DynamoDB Streams捕获项目级别的按时间顺序排列的序列     DynamoDB表中的修改。该时间顺序是     保留在每个分片级别。换句话说,     碎片是根据项目创建的顺序建立的,     更新或删除。 --     https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html

      
  6.