用于过程/事务监控的Dynamodb数据模型

时间:2015-06-22 23:06:57

标签: amazon-dynamodb data-modeling nosql

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

可能只需要以下字段

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

如果您确定将此索引用于未完成的事件,则在转换为已完成状态时从记录中删除derivedStatusId属性也会将其从索引中删除 - 这可能是如果预计事件最终会完成处理,并且如果它们永远存在,那么这是一个很好的属性。这种技术称为“稀疏索引”,更详细地描述了here

从您的问题来看,似乎保持状态历史记录是一个理想的属性(我假设这是因为您希望有多行用于状态更改)。请考虑将此历史信息放在同一行中。 DynamoDB支持列表数据类型,并且还具有400KB的大量限制,可以让您在同一记录中捕获所有所需的历史信息。