您走在正确的轨道上,您在每天执行导入作业时应该非常小心处理写入操作的方式。 还要避免不必要地添加索引,因为它们只会增加您的写作操作。
使用customer_id 作为哈希键和item_no 作为范围键将提供最佳选择,不仅可以查询,还可以上传数据。
正如您所提到的,客户 ID 的随机化将非常有助于优化资源的使用并防止出现热分区的可能性。在您的情况下,我将遵循 DynamoDB 文档中包含的确切示例:
[...] 增加此应用程序写入吞吐量的一种方法
将是跨多个分区键值随机写入。
从固定集合中选择一个随机数(例如,1 到 200),然后
将其连接为后缀 [...]
因此,当您编写客户信息时,只需将后缀随机分配给您的客户 ID,请确保均匀分配它们(例如 CustomerXYZ.1、CustomerXYZ.2、...、CustomerXYZ.200)。
要阅读所有项目,您需要获取每个后缀的所有项目。例如,您将首先发出对分区键值 CustomerXYZ.1 的查询请求,然后对 CustomerXYZ.2 发出另一个查询,以此类推通过 CustomerXYZ.200。因为您知道后缀范围(在本例中为 1...200),您只需查询将每个后缀附加到客户 ID 的记录。
哈希键 CustomerXYZ.n 的每个查询都应从该特定客户返回一组项目(由范围键指定),您的应用程序需要合并所有查询请求的结果。
这肯定会让您更难阅读记录(就所需的额外请求而言),但是,优化吞吐量和性能的好处将得到回报。请记住,热分区不仅会增加您的整体财务成本,还会极大地影响您的性能。
如果您有一个设计良好的分区键,您的查询将始终以最低的成本快速返回。
此外,请确保您的导入作业不执行按客户分组的写入操作,例如,不要按顺序写入来自特定客户的所有项目,而是对写入操作进行排序,以便将它们分配给所有客户。即使您的客户将分布在多个分区中(由于 id 随机化过程),您最好采取这种额外的安全措施来防止单个分区中的写入活动爆发。更多详情如下:
来自官方 DynamoDB 文档的“在数据上传期间分发写入活动”部分:
为了充分利用所有的吞吐能力
为您的表配置,您需要分配工作负载
跨分区键值。在这种情况下,通过引导不均匀
对所有具有相同分区键的项目的上传工作量
价值,您可能无法充分利用所有资源
DynamoDB 已为您的表预置。您可以分发您的
通过首先从每个分区键值上传一项来上传工作。
然后为下一组排序键值重复该模式
所有项目,直到您上传所有数据 [...]
来源:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html
我希望这会有所帮助。问候。