在App Engine文档中,我发现an interesting strategy通过使用游标来保持数据存储中的最新变化:
游标的一个有趣应用是监视实体的未见更改。如果应用程序每次实体更改时都使用当前日期和时间设置一个timestamp属性,则该应用程序可以使用按timestamp属性排序的查询,并使用数据存储区游标升序检查何时将实体移到结果列表的末尾。如果实体的时间戳已更新,则带有游标的查询将返回更新的实体。如果自上次执行查询以来未更新任何实体,则不会返回任何结果,并且光标不会移动。
但是,我不确定这将如何始终有效。毕竟,使用High Replication数据存储区时,查询最终只会保持一致。因此,如果放置了两个实体,并且查询仅看到两个实体中的较晚一个,它将使光标移过两个实体。这意味着两个新实体中的第一个将保持不可见状态。
那么这是一个实际的问题吗?还是有其他方法可以使游标解决此问题?
最佳答案
在包含单调递增值(例如当前时间戳记)的属性上具有内置索引或复合索引可能无法达到您在高写入速率下所需的性能。这种类型的工作负载将产生一个热点,因为索引的尾部会不断更新,而不是在整个排序的索引中分配负载。但是,对于低写入速率,这将可以正常工作。
其余答案将取决于您是在同一实体组中还是在不同的实体组中。
如果您的查询是祖先查询,因此在同一实体组中,它可以是高度一致的(默认情况下是一致的),并且所描述的方法应始终准确。该查询将立即看到任何写入(对实体组内的实体所做的更改)。
如果要查询的多个实体组最终始终保持一致,则无法保证写入/显示的顺序。例如:
-时间1-写EntityA
-时间2-写入EntityB
-Time3-查询仅看到EntityB
-Time4-查询看到EntityA和EntityB
因此,使用游标检测更改的方法是正确的,但是它可能会“跳过”某些更改。
有关最终/强一致性的更多信息,请参见Balancing Strong and Eventual consistency with Google Cloud Datastore