【发布时间】:2017-01-17 06:13:36
【问题描述】:
Datastore 文档非常清楚,如果您包含“单调递增的值”(例如当前的 unix 时间),则“热点”存在问题,但是没有提到一个好的替代方案,也没有解决是否存储完全相同(而不是增加值)会创建“热点”:
“不要为具有单调递增值(例如 NOW() 时间戳)的属性编制索引。维护这样的索引可能会导致热点影响具有高读写率的应用程序的 Cloud Datastore 延迟。” https://cloud.google.com/datastore/docs/best-practices
我想存储每个特定实体插入数据存储区的时间,但如果不可能,只存储日期也可以。
不过,这似乎更有可能导致“热点”,因为 24 小时内的每个新实体都会被添加到同一个索引中(无论如何这是我的理解)。
也许关于索引的工作原理(我很难找到关于它们的工作原理的很好的解释)以及一遍又一遍地拥有相同的值索引是好的,但递增值不是。
如果有人对此问题有答案,或者有更好的关于数据存储索引如何工作的文档,我将不胜感激。
【问题讨论】:
-
我有同样的想法来存储日期而不是小时/分钟/秒。我认为它不会导致比存储完整时间戳更多的热点。假设有一个平板电脑处理请求,它在高负载下分成两个平板电脑。拆分可能导致 tabletA 处理 day0 到 day15,而 tabletB 处理 day16 到 day31。无论您存储 day0 的完整时间戳还是纯日期,tabletA 仍会处理负载。因此,存储纯日期可能不会比存储完整时间戳更糟糕。然而,问题是它是否会更好。
-
我们先把日期放在一边。他们如何在高负载下处理简单的布尔值和枚举值?我猜他们会分裂一些重叠,否则它不会扩展。例如。 tabletA 可以处理 val1、val2,tablet B 可以处理 val2、val3。将这个概念应用于日期时,也许他们可以拆分,使得 2 个平板电脑可以在同一天共享相同的负载。但是,一年中有很多天,它们可能不会以使 2 个平板电脑处理同一天的方式进行拆分。那么,也许它终究没有多大帮助?我不知道他们是如何确定分裂的。
标签: google-app-engine google-cloud-datastore