Amazon web services DynamoDB可伸缩性:如何设计partionkey与索引

Amazon web services DynamoDB可伸缩性:如何设计partionkey与索引,amazon-web-services,nosql,amazon-dynamodb,amazon-dynamodb-index,Amazon Web Services,Nosql,Amazon Dynamodb,Amazon Dynamodb Index,如中所述,分区密钥应该是唯一的 我正在构建一个需要存储对某个主题的订阅的应用程序(想想聊天应用程序)。数以百万计的订阅需要存储在数据库中,当有消息发送给订阅服务器时,应用程序需要从表中获取所有订阅服务器 天真的方法 天真的方法是,设计一个主键,如: 订阅| 然后,sortkey将根据订阅时间、地区和其他一些条件来订购的所有订阅 不幸的是,分区键到目前为止还不是唯一的,但它允许在一瞬间获取所有订阅 此外,考虑到最大表大小,会对分区中可以保存的订阅数设置一个硬限制,从而对这种设计设置最大订阅数。因此

如中所述,分区密钥应该是唯一的

我正在构建一个需要存储对某个主题的订阅的应用程序(想想聊天应用程序)。数以百万计的订阅需要存储在数据库中,当有消息发送给订阅服务器时,应用程序需要从表中获取所有订阅服务器

天真的方法

天真的方法是,设计一个主键,如:

订阅|

然后,sortkey将根据订阅时间、地区和其他一些条件来订购
的所有订阅

不幸的是,分区键到目前为止还不是唯一的,但它允许在一瞬间获取所有订阅

此外,考虑到最大表大小,会对分区中可以保存的订阅数设置一个硬限制,从而对这种设计设置最大订阅数。因此,这是为了使可伸缩性失败而设计的

备选方案

另一种设计方法是使用

订阅|

为每个客户端分别保存每个订阅,并将
移动到sortkey中。这将允许更好地扩展表(分区),但需要扫描以查找特定
的所有订户


索引在这里可能有帮助,但索引如何在多个分区上扩展?它将如何执行?

您是否考虑过使用topic+clientId作为分区键,就像在
订阅|
中一样?这将是一个唯一的分区键,然后您可以使用查询操作和
开头带
操作符来获取对特定主题的所有订阅。是的,我知道了,但我知道开头带仅对sortkey有效?也许我错了。。让我研究一下;)似乎不是这样:哦。这就是罪过。你可以把碎片索引附加到你的分区键上,然后并行查询所有碎片。所以关键是:
订阅|#
其中
碎片索引
可能是,例如,介于0和128之间的随机数。分片密钥可以是客户端id的一些散列(模128,一些素数可能更适合分片上限),因此可以轻松找到和更新客户端的订阅。