如何始终从Google Cloud Datastore中读取最新实体

时间:2017-11-19 22:42:00

标签: google-app-engine google-cloud-datastore google-cloud-platform

据我了解,Google Cloud Datastore允许我在没有任何时间限制的情况下编写新条目,但限制了我更新实体的频率。此外,索引不是很一致。

我正在快速将与单个气象站相关的新传感器数据写入数据存储区。该实体还包含时间戳。气象站和时间戳有一个索引分类传感器读数。

现在的目标是始终将最新值返回给请求特定气象站当前值的用户,但由于索引最终是一致的,因此返回值可能不是最新值。

架构在Google App Engine上的外观是什么样的,它总能返回最近的值,而不会有单个实体达到写入限制的风险?

2 个答案:

答案 0 :(得分:3)

将单个实体组中的一个站点的所有数据写入并使用祖先查询的替代方法是将传感器读数写为单独的新实体,并重写一个包含最多密钥的(小)知名实体最近的读物实体。

要获得最新的测量结果,您只需从知名实体获取其密钥,然后通过密钥查找获取实体 - 始终保持一致。

你仍然只能以不超过每秒一次(平均)的速度编写样本,但至少采用这种方法:

  • 不使用祖先,因此可以避免您当前拥有的大型每站实体组以及哪些可能导致争用,请参阅Keep entity groups small
  • 不使用数据存储区查询
  • 不需要索引,从而避免了您当前索引单调增加的时间戳属性的热点问题(请参阅High read/write rates to a narrow key range
  • 不会受到读数样本大小的影响 - 只会重写一个固定规模的小型知名实体

如果你真的需要每秒写入超过1个传感器读数,你可以尝试:

  • 使用分片策略与多个已知实体(最多25个 - 这是跨组事务中可以访问的最大实体组数)包含写入数据存储区的最近读数的键。您必须在事务中阅读所有这些内容并选择具有最新时间戳的那个
  • 使用memcache而不是众所周知的实体 - 很容易重写,因为memcache可以容忍更高的写入速率。但是你需要接受这样的可能性,即偶尔memcache可能会失败,你将不得不诉诸一些基于查询的回退故事来恢复,在此期间你可能会返回一些不是最新的读数(或者只是在这些时期内保持返回错误是可以接受的?)

答案 1 :(得分:0)

尝试阅读:

https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/

基本上,使用祖先查询,然后您的查询将非常一致 - 您将能够查询最新的更新。

Google Cloud Datastore支持每个实体组每秒写入一次。只要每个气象站每秒写入不到一次的实体组,你就可以了。