【问题标题】:Index timestamp in Google DatastoreGoogle Datastore 中的索引时间戳
【发布时间】:2021-09-19 07:21:45
【问题描述】:

我之前的问题:Errors saving data to Google Datastore

我们在写入数据存储区时遇到了问题。基于上一个问题,我们认为问题在于我们正在使用 YYYY-MM-DDTHH:MM:SSZ(例如 2021-04-29T17:42:58Z)索引“SeenTime”属性,这正在创建一个热点(请参阅:https://cloud.google.com/datastore/docs/best-practices#indexes)。

我们需要为此编制索引,因为我们按日期查询数据,并且需要在最终应用程序中进行每次观察的时间。有没有办法解决这个问题,我们仍然可以按日期查询?

【问题讨论】:

  • 这能回答你的问题吗? Exploding indexes and unix timestamp
  • 此外,如果您确实有一个单调递增的键或索引属性,那么您可以预先添加一个随机散列以确保将键分片到多个平板电脑上。这些都记录在 GCP 中。
  • 我无法理解您的第一个链接,抱歉——我对此很陌生。如果我们在单调递增的时间戳索引前添加一个随机散列,我们以后如何查询它?我们使用的查询是:QUERY = "SELECT * FROM event WHERE seenTime >= '{}' AND seenTime <= '{}'".format(day_before_start, day_before_end) 在我们的烧瓶应用程序中,似乎没有办法在查询期间对哈希进行子串化。

标签: node.js google-cloud-platform google-cloud-datastore datastore


【解决方案1】:

这个答案有点晚了,但是:

  1. 在您之前的问题中,甚至在编写查询之前,感觉主要问题是“遇到问题写入”(DEADLINE_EXCEEDED/UNAVAILABLE)-> 它发生在“一些保存”上——因此,尚不完全清楚是否这是由于数据热点或“在更短的突发中摄取更多数据”导致争用(请参阅"Designing for scale")。

Datastore 模式下的单个实体不应更新得太快。如果您使用的是 Datastore 模式,请设计您的应用程序,使其每秒更新实体的次数不会超过一次。如果您更新实体的速度过快,那么您的 Datastore 模式写入将具有更高的延迟、超时和其他类型的错误。这称为争用。

  1. 您需要为键添加前缀以索引单调递增的时间戳(如最佳实践文档中所述)。然后你可以在控制台中test your queries using GQL interface。但是,由于您很可能想要“所有事件”,我认为这是不可能的,因此会导致热点和读取延迟。

  2. 给人的印象是延迟可能是不可避免的。如果是这样,那么您需要根据查询的频率/返回的元素数量以及延迟量(性能影响)来决定它是否可以接受。

  3. 考虑切换到 Firestore 原生模式。它具有不同的底层架构,是 Datastore 的下一个版本。虽然 Firestore 并不完美,但它can be more forgiving 涉及热点和争用,因此您遇到的问题可能比 Datastore 少。

【讨论】:

    猜你喜欢
    • 2020-09-06
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2018-08-25
    • 2018-10-07
    • 2012-05-23
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多