amazon-web-services - DynamoDB 架构 - 检索所有用户
问题描述
我正在尝试为我的数据建模。如您所见,分区键是用户电子邮件。在全球二级索引中,我有一个“US”的 PK,代表“用户”。如果我想获得所有启用的用户,我只需要查询 GSI1PK = "US" 和 GSI1SK 以 "Enabled" 开头的 GSI。
我担心应用程序中的所有用户都将拥有相同的 GSI1PK。这会是一个问题吗?GSI PK 是否会出现“热分区”问题?我在谷歌上搜索这个,我没有看到一个明确的答案。StackOverflow 上只有一个地方说这将是一个问题,但还有其他地方说它不会。我有点困惑。
在我的表中构造数据的最佳方法是什么,以便我可以访问所有用户而不会导致热分区问题?
解决方案
将潜在的大型项目集合放在单个分区中可能会导致热分区。理想情况下,您选择的分区键在分区之间均匀分布数据。但是,如何实现这一点可能并不总是很清楚。
您可能会考虑在写入时将大分区拆分为较小的分区(也称为写入分片),并在读取时重新组合它们。例如,在创建 GSIPK 时,您可以在分区键中引入一个 1 到 4 之间随机生成的整数:
你的 GSI 看起来像这样
现在,您的用户数据更均匀地分布在各个分区中。从您的表中读取用户时,您将一次从所有分区中提取。这可以并行完成以获得更快的性能。
在此示例中,我选择了一个随机数将数据“写入分片”到单独的分区中。但是,您的数据可能适合更自然的划分(例如,按国家、启用状态、时区等)。我想强调的是,跨分区分配数据的策略可以与用于支持应用程序访问模式的数据模型分开。
推荐阅读
- kubernetes - 无法将 Pod 间关联性应用于 Airflow 调度程序
- django-rest-framework - 图像没有显示在 index.html 上,我正在 Django 中编辑酒店模板,只是基础知识
- c# - 使用 MediatR 控制器删除多个 ID
- python - 仅在完成写入后使用 .hdf5 文件
- r - make-distribution.sh 在 Make R 包步骤失败时失败。没有提供参数
- javascript - bsmultiselect:如何获取用户选择的项目列表或数组?
- azure - 如何通过 Azure CLI 将触发器绑定到 Azure Datafactory Pipeline?
- nlp - BERT 的输入是令牌 ID。如何将相应的输入令牌向量输入 BERT?
- airflow - 如何将 conf 传递给计划的 DAG
- spring-boot - 在 Spring Boot REST 控制器中反序列化之前记录原始请求正文