【问题标题】:How can i avoid GoogleAppEngine DataStore delay?如何避免 GoogleAppEngine DataStore 延迟?
【发布时间】:2012-02-03 09:51:29
【问题描述】:

我是 App Engine 的新手,并编写了一个示例应用程序。如果我创建或更新实体:

Entity record = new Entity(...);
... set properties
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
datastore.put(record);

然后重定向到显示新实体或更新实体的页面

resp.sendRedirect("MainPage.jsp");

以下代码的执行位置

DatastoreService datastore =
DatastoreServiceFactory.getDatastoreService();   
Query query = new Query(...).addSort(..., Query.SortDirection.DESCENDING); 
List<Entity> entities = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(20));

新记录不在列表中。页面已更新(如显示的时间戳所示),但新记录或现有记录的修改仅在我刷新页面时延迟几秒钟后才会显示。

如何避免这种情况? DataStore 可能不适合这样的事情吗?

我正在使用来自 GAE 的 Eclipse 本地测试环境和 Windows XP 64。

【问题讨论】:

标签: java google-app-engine jsp servlets


【解决方案1】:

是的,这称为"eventual consistency",是 HRD 的默认更新模型(现在所有新实例都默认)。

因此,放置一个实体然后查询它可能不会返回(事件一致性),但放置它然后获取它(get 通过键)将立即返回它(强一致性)。

解决办法是:

  1. 使用主从数据存储,或
  2. 如果可能,重写代码以使用 get 而不是查询。

此外,本地开发服务器仅用于测试,其行为与生产实例不完全相同,因此您应该始终(最终)在生产环境中进行测试。

【讨论】:

  • 我不建议使用主从数据存储。为了克服“最终一致性”,有一些技巧,其中之一是通过键获取实体,另一个是利用实体组对数据进行建模。因为对父级的查询应该返回强一致性结果。
【解决方案2】:

由于您在 GAE 上运行,因此最好的选择是使用其 Memcache 进行短期检索(您仍然需要将内容放入 DataStore 以保持持久性)。

【讨论】:

  • 请记住,memcache 不能保证返回任何内容,因此您的位置与 HR 数据存储的“最终一致性”大致相同。
猜你喜欢
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 2020-09-03
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
相关资源
最近更新 更多