是否可以在 Azure Cosmos DB 中为可扩展的 Follower/Following 关系建模?
Is it possible to model a scalable Follower/Following relationship in Azure Cosmos DB?
假设我有一个模型 class 看起来像这样:
public class Relationship
{
public Guid PartitionKey { get; set; }
public Guid Id { get; set; }
public DateTime CreatedOn { get; set; }
}
PartitionKey
是Relationship
容器的partition key,用被关注者的用户id表示。 (接收者)
Id
是容器的id,用关注对方的人的用户id表示。 (发件人)
此模型确保不能将相同的 Id
添加到相同的 PartitionKey
中,从而只能在两个用户之间创建一次 follower/following 关系。它还允许我轻松查找特定人的所有关注者列表,这很重要。
问题是每个逻辑分区限制为 10 GB 的数据。考虑到实际的 Relationship
模型可能有更多的属性,并且在幕后发生自动索引并且一些用户有数百万的关注者,这个限制将被触及,并且不可能允许同一个分区的新关系关键。
如何在 Cosmos DB 上设计这一模型,使其真正具有可扩展性?
此处的标准方法是手动将数据分片到多个分区,通常 synthetic partition key 将多个项目放在一起。
一个简单的策略是在用户记录中使用一个整数字段来跟踪用于存储所有关注者记录的“桶”的数量,然后根据需要向每个桶分区发送查询。桶的数量可以随着数据的增长而增加。
例如,分区键将构造为 [user_id]+[follower_bucket_count]
。您还可以维护每个存储桶的计数以实现更高级的负载平衡,但这可能没有必要开始。
假设我有一个模型 class 看起来像这样:
public class Relationship
{
public Guid PartitionKey { get; set; }
public Guid Id { get; set; }
public DateTime CreatedOn { get; set; }
}
PartitionKey
是Relationship
容器的partition key,用被关注者的用户id表示。 (接收者)Id
是容器的id,用关注对方的人的用户id表示。 (发件人)
此模型确保不能将相同的 Id
添加到相同的 PartitionKey
中,从而只能在两个用户之间创建一次 follower/following 关系。它还允许我轻松查找特定人的所有关注者列表,这很重要。
问题是每个逻辑分区限制为 10 GB 的数据。考虑到实际的 Relationship
模型可能有更多的属性,并且在幕后发生自动索引并且一些用户有数百万的关注者,这个限制将被触及,并且不可能允许同一个分区的新关系关键。
如何在 Cosmos DB 上设计这一模型,使其真正具有可扩展性?
此处的标准方法是手动将数据分片到多个分区,通常 synthetic partition key 将多个项目放在一起。
一个简单的策略是在用户记录中使用一个整数字段来跟踪用于存储所有关注者记录的“桶”的数量,然后根据需要向每个桶分区发送查询。桶的数量可以随着数据的增长而增加。
例如,分区键将构造为 [user_id]+[follower_bucket_count]
。您还可以维护每个存储桶的计数以实现更高级的负载平衡,但这可能没有必要开始。