作者:手机用户2602914627 | 来源:互联网 | 2022-12-10 14:02
我在DynamoDB中有一个包含如下属性的表:
OrderId,OrderJson,OrderStatus.
订单状态的值可以是0或1.我需要能够更新指定订单的状态,还可以根据状态字段获取订单.其中一个选项是使用扫描,另一个选项是使用状态为分区键的辅助索引,但状态字段具有较小的值范围.请建议描述要求的最佳做法是什么?谢谢!
1> tleef..:
我不会选择扫描,因为除非您的订单很少,否则它不具有成本效益或特别有效.
简而言之,您在全球二级索引中处于正确的轨道上.(我假设你在谈论全球二级索引.还有本地二级索引,但我不知道这些对这个案例有多大帮助.
无论如何,我会创建一个GSI,其中OrderStatus作为Hash键,OrderId作为Range键.但是,有几件事需要注意.
1)写入吞吐量.请记住,具有相同OrderStatus的订单将写入GSI上的同一磁盘.这就是Dynamo的工作方式,使用相同Hash密钥的文档会转到同一个地方.这意味着无论您为表设置的写入吞吐量是多少,单个磁盘上的写入吞吐量都有一个上限.确保不会超过该上限.
2)读取吞吐量.几乎与写入吞吐量相同但是对于读取.读取限制高于写入限制,但仍需要注意.
3)寻呼.每当使用哈希键查询Dynamo表时,在本例中为OrderStatus,它会自动将响应的大小限制为1 MB.因此,您可能需要发出多个连续的Query请求来读取特定OrderStatus的所有订单.
好消息是所有这些问题都有基本相同的解决方案,"分片".在这种情况下,分片的意思是为OrderStatus添加后缀.例如,如果OrderStatus可以是1或0,则可以创建另一个字段,例如OrderShard,可以是1_0,1_1,1_2,...,1_9,0_0,0_1,0_2,...,0_9.我们基本上只需在0到9之间添加一个随机整数到OrderStatus的末尾,以便在GSI上创建更多可能的Hash密钥值.这意味着您的数据会分散在更多磁盘上,解决1和2,您可以进行并行查询请求,大部分解决3.
现在您将使用OrderShard,而不是使用OrderStatus作为GSI上的Hash密钥.仍然使用OrderId作为Range键.此外,如果每个OrderStatus值10个分片不够,只需增加分片数.例如,在0-99之间添加一个随机数.您需要多少个分片取决于您的规模和吞吐量.