我正在研究在 Amazon DynamoDB 之上实现可扩展的无序对象集合。到目前为止,已经考虑了以下选项:
使用 DynamoDB 文档数据类型(地图、列表)并使用文档路径来访问独立项目。这对于收集限制为 400KB 的数据有一个明显的缺点,这意味着可能有 1..10K 个对象,具体取决于它们的大小。不太明显的缺点是将新对象插入此类集合的成本将是巨大的:亚马逊指定将根据总项目大小扣除写入容量,而不仅仅是新添加的对象 - 因此约 400 个容量单位接近大小限制时插入 1KB 对象。那么考虑到这一点排除了吗?
使用复合主散列 + 范围键,其中主散列对于集合中的所有对象保持相同,范围键只是随机或原子计数器。明显的缺点是具有相同的哈希键会导致错误的键分布——当有大量对象的集合时基数很低。这意味着分区错误,并且存在规模问题,同一集合上的所有读/写都卡在一个分片上,受到 DynamoDB 分区每秒 3000 次读取/1000 次写入的限制。
使用带有二级哈希 + 范围键的全局二级索引,其中哈希键对于属于同一集合的所有对象保持相同,而范围键只是随机的或原子计数器。与上面类似,GSI 的分区变得很差,并且它将成为一个瓶颈,因为太多相同的哈希值会迅速耗尽所有预置容量到索引。我没有找到 GSI 是如何准确实现的,因此不确定它受低基数的影响有多严重。
问题是,我是否可以忍受 (2) 或 (3) 并遭受不理想的密钥分配,或者是否有另一种实现被忽视的集合的方式,或者我应该考虑研究另一个 nosql 数据库引擎。