用于 process/transaction 监控的 Dynamodb 数据模型

Dynamodb data model for process/transaction monitoring

我想跟踪多阶段处理作业。

可能只需要以下字段

batchId (guid) | eventId (guid) | statusId (int) | timestamp | message (string)

每批事件的数量相对较少。

我希望能够轻松查询 statusId 小于 n 的事件(仍在处理或未完成处理)。

每个状态更改使用多行并查询最新状态是否是最佳方法?我会使用全局二级索引,但 StatusId 似乎不是哈希键的好候选者(少于 10 个状态)。

如果您更新相同的事件行,而不是为每个状态更改使用多行,则可以使用 'Use a Calculated Value' 部分的 DynamoDB documentation 中描述的技术。基本上,这将涉及添加另一个属性(例如 'derivedStatusId'),该属性将通过在写入 DynamoDB 时将随机数附加到 statusId 来派生。例如,对于 2 的 statusId,derivedStatusId 可以是 {"2-00", "2-01", .. "2-99"} 之一。在 derivedStatusId 上设置全局二级索引会给你一些扇出,这将有助于防止索引变热。

如果您确定要将此索引用于 未完成的事件,则在记录转换为完成状态时从记录中删除 derivedStatusId 属性会将其从索引中删除同样 - 这可能是一个很好的 属性 如果事件预计最终会完成处理,并且如果它们永远存在。这种技术称为 "Sparse Index" 并且在 here.

中有更详细的描述

从你的问题来看,似乎需要保留状态历史记录 属性(我假设这是因为你想要多行来记录状态更改)。考虑将此历史信息放在同一行中。 DynamoDB 支持列表数据类型,也有一个慷慨的 400KB 项目限制,这可能只允许您在同一条记录中捕获所有需要的历史信息。