【发布时间】:2016-02-09 21:21:17
【问题描述】:
我在架构设计方面需要帮助。
我有数十亿个实体,每个实体都有一个静态生命周期。意味着一个实体通过州毕业S1->S2->S3->S4;其中S1 是开始,S4 是结束。
一个典型的查询是:显示Sn-1 中但不在Sn 中的记录。 Sn-1 中的大多数实体最终都会到达 Sn。每次实体更改状态时,我都会收到一个事件。
我的设计问题是我必须进行全表扫描才能响应查询。
是否有行键设计以避免全表扫描?
或者,我可以将密钥更改为:entityId-State
但这并没有真正的帮助......
另一种选择是为每个州创建一个表,然后我可以执行以下操作:
- 对于实体 E1 - 接收 event-transition-to-s1:-> 将实体放入 Table-S1
- 对于实体 E1 - 接收 event-transition-to-s2:-> 从 Table-S1 中删除实体并将实体添加到 Table-S2
这样,当他们查询向我显示 S1 中而不是 S2 中的所有事件时,我只向他们显示 Table-S1 中的所有事件。
这种方法的问题在于它不是幂等的。如果系统中发生某些事情并且我将事件弄乱了,我会遇到问题。
【问题讨论】:
-
非生命周期数据有多大?还是只是实体键和状态?状态可以存储为字节 1,2,3,4 吗?
-
@MartinSerrano 是的,状态可以存储为位图中的数字或位。我打算存储转换的日期,但我不必将这些数据保存在 HBase 中
-
还有其他疑问吗?您对磁盘空间利用率有多敏感?一些解决方案涉及以多种方式存储数据。
-
@MartinSerrano - 让我们只专注于那个查询。
-
真的只有 4 个州还是有时更多?