我需要在架构设计方面的帮助。
我有数十亿的实体,每个实体都有一个静态的生命周期。这意味着一个实体通过州S1->S2->S3->S4毕业;其中S1是开始,S4是结束。
一个典型的查询是:显示Sn-1中的记录,而不是Sn中的记录。Sn-1中的大多数实体最终将到达Sn。我得到一个事件,每次实体更改状态。
我的设计的问题是,我必须做一个全表扫描来响应查询。
是否有行键设计以避免全表扫描?
或者,我可以将我的密钥更改为:entityId-State
但这不会有帮助..。
另一种选择是为每个国家创建一个表格,然后我可以做以下工作:
这样,当他们查询时,向我显示S1中的所有事件,而不是S2中的事件,我只会在表-S1中显示所有的内容。
这种方法的问题在于它不是幂等的。如果系统中发生了什么事情,而我把事情弄得乱七八糟,我会遇到问题。
发布于 2016-02-09 22:33:21
对于查询Sn-1 ,在中显示记录,但不显示
更新更新,按任何顺序到达
使行键State-entityId。然后,列数据可以是转换日期。为状态转换编写行时:
在这样的解决方案中,必须考虑同时更新。有各种处理策略,但要充分考虑需要更多地了解体系结构的客户端。是否有可能同时对同一实体进行状态更新?想必,否则他们就不能扰乱秩序了。如果是这样,所有的检查、删除和更新都可以按任何顺序进行。然后,如果没有某种类型的外部锁定,上面的方案就无法工作,而这种锁在数十亿行中是不可能可行的。
我假设州的数量很小(对许多州来说意味着大量的删除)。由于entityId在行键中,您可能会避免热点。
然后,可以根据所需的状态进行前缀范围扫描。由于删除了以前的状态,您知道对Sn的扫描将(通常)没有状态Sn+1中的记录。由于无法以原子方式执行删除和添加操作,因此将出现小窗口。但是,假设您的查询是从更新异步执行的(而且它们可能是无序的),所以无论如何,您都不能保证查询执行完全一致的固定时间。
https://stackoverflow.com/questions/35302412
复制相似问题