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

How to always read most recent entity from Google Cloud Datastore

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

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

现在的目标是始终 return 为用户请求特定气象站的当前值的最新值,但由于索引只是最终一致的,因此 return 可能会发生ed 值不是最新的。

任何想法在 Google App Engine 上的架构看起来如何总是 return 最新的值而没有达到单个实体的写入限制的风险?

尝试阅读:

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

基本上,使用祖先查询,然后您的查询将是高度一致的——您将能够查询最新的更新。

Google Cloud Datastore 支持每个实体组每秒写入一次。只要每个单独的气象站每秒写入其实体组的次数少于一次,就可以了。

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

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

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

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

如果您确实需要每秒写入超过 1 个传感器读数,您可以尝试:

  • 对多个知名实体(最多 25 个 - 这是在跨组事务中可以访问的实体组的最大数量)使用分片策略,其中包含写入数据存储的最新读数的键。你必须在一笔交易中阅读所有这些,然后选择时间戳最近的那个
  • 使用 memcache 而不是众所周知的实体 - 由于 memcache 可以容忍更高的写入率,因此很容易重写。但是您需要接受 memcache 偶尔会失败的可能性,您将不得不求助于一些基于查询的回退故事来恢复,在此期间您 可能 返回一些不真正最新的读数(或者可能只是在这些期间不断返回错误是可以接受的?)