【问题标题】:Write/Read with High Replication Datastore + NDB使用高复制数据存储 + NDB 写入/读取
【发布时间】:2012-09-04 06:38:38
【问题描述】:

所以我最近一直在阅读很多关于 HRD 和 NDB 的文档,但我仍然对 NDB 是如何缓存的东西有一些疑问。

示例:

想象这样一种情况,用户写入数据,应用程序需要在写入后立即获取数据。例如。用户创建一个“组”(类似于 Facebook/Linkedin 组)并在创建后立即重定向到该组。 (现在,我正在创建一个组,但没有为其分配祖先)

结果:

在本地测试此类功能时(启用了高复制),立即获取新创建的组失败。返回一个 NoneType。

问题:

浏览了 High Replication 文档和 Google IO 视频后,我了解到写入延迟较高,但是,NDB 缓存不应该解决这个问题吗? IE。写入被缓存,然后异步实际写入磁盘,因此,立即读取将从缓存中读取,因此应该没有问题。我需要强制执行一些其他设置吗?

【问题讨论】:

    标签: google-app-engine python-2.7 google-cloud-datastore


    【解决方案1】:

    很确定您遇到了查询“最终一致”的 HRD 功能。 NDB 的缓存与此行为无关。

    【讨论】:

      【解决方案2】:

      我怀疑这可能是因为返回 NoneType 的重定向。

      https://developers.google.com/appengine/docs/python/ndb/cache#incontext

      上下文缓存仅在单个传入 HTTP 请求期间持续存在,并且仅对处理该请求的代码“可见”。它很快;这个缓存存在于内存中。当 NDB 函数写入数据存储时,它也会写入上下文缓存。当 NDB 函数读取实体时,它首先检查上下文缓存。如果在此处找到实体,则不会发生 Datastore 交互。 查询不会在任何缓存中查找值。但是,如果缓存策略如此,查询结果将被写回上下文缓存(但永远不会写回 Memcache)。

      因此,您将值写入缓存,重定向它,然后读取失败,因为重定向上的 HTTP 请求是不同的,因此缓存不同。

      我在这里达到了我的知识极限,但我最初建议您尝试在事务中创建并在完成/成功时重定向。

      https://developers.google.com/appengine/docs/python/ndb/transactions

      此外,当您将组模型放入数据存储区时,您将获得一个密钥。您可以将该密钥(例如通过 urlsafe)传递给重定向,然后您就可以保证检索数据,因为您拥有它的显式密钥?如果它毕竟不在数据存储中,就不能拥有它的密钥。

      另外我建议在生产服务器上尝试它,有时本地和生产中的行为可能会非常不同。

      【讨论】:

      • 谢谢。上下文缓存的 HTTP 请求问题是有道理的。但是,将其变成事务操作并不能解决问题。如果我错了,请纠正我,但 Datastore 在将密钥写入磁盘之前会返回一个密钥。这就是为什么即使我得到一个密钥,当我得到()它时,它也会返回一个 NoneType。我猜一种解决方法可能是将它的内存缓存几秒钟......这是一个好的解决方案吗?
      • 阅读此内容:developers.google.com/appengine/docs/python/datastore/… 它还说“由于数据存储区获取和祖先查询在执行之前应用了任何未完成的修改,因此这些操作始终可以看到所有先前成功事务的一致视图。这意味着获取操作(通过其键查找更新的实体)保证看到该实体的最新版本。”因此,据我所知,在使用从 put 生成的密钥执行 get 之后,您不应该得到 noneType。
      • 谢谢。我认为“一致”的 GAE 是指系统周围没有部分更新的数据。我认为这并不意味着在返回密钥时写入数据。我做了更多的测试,当我更新一个值并且不重定向到一个页面时,我会立即看到新值(它来自上下文缓存)。但是,当我更新和重定向时,该值不会在第一页加载时更新(由于您提到的 HTTP 请求问题)。只有当我重新加载(它有时间写入磁盘)时,我才能看到更新的值。
      • 这很奇怪,因为我经常重定向到用户刚刚创建的内容并且它总是在那里。然后我建议将内容显式放入 memcache 并在下一个请求时将其重新取出,即使 ndb 也将被缓存。
      • 而我重定向的原因是为了避免在您尝试在 HTTP POST 后重新加载页面时出现烦人的“确认重新加载页面”警报,从而重新发送 POST 数据...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2012-01-23
      • 2021-01-17
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多