Google App-Engine数据存储非常慢

use*_*246 9 java performance google-app-engine

我需要帮助来理解为什么下面的代码需要3到4秒.

更新:我的应用程序的用例是获取自上次登录以来的人的活动供稿.此Feed可能包含来自朋友的更新或他网络之外的一些他可能感兴趣的新项目.Activity表存储所有这些活动,当用户登录时,我在GAE-DataStore上运行查询以返回上述活动.我的应用程序也支持无限滚动,因此我需要GAE的光标功能.在给定的时间,我得到大约32个项目,但活动表可能有数百万行(因为它包含来自所有用户的数据).

目前,Activity表很小,只包含25条记录,下面的java代码只读取同一个表中的3条记录.

Activity表中的每条记录都有4个UUID字段.

我无法想象如果表包含数百万行并且结果包含100行,则查询将如何表现.

以下代码有什么问题吗?

(我正在使用Objectify和app-engine游标)

Filter filter = new FilterPredicate("creatorID", FilterOperator.EQUAL, userId);
Query<Activity> query = ofy().load().type(Activity.class).filter(filter);
query = query.startAt(Cursor.fromWebSafeString(previousCursorString));
QueryResultIterator<Activity> itr = query.iterator();
while (itr.hasNext())
{
    Activity a = itr.next();
    System.out.println (a);
}
Run Code Online (Sandbox Code Playgroud)

我已经浏览了Google App Engine应用程序非常慢并且验证了如果我继续刷新页面(调用上面的代码),响应时间会有所改善.但是,改善只有~30%

将此与任何其他数据库进行比较,这些微小数据的响应时间以毫秒为单位,甚至不到100毫秒.

我期望从GAE DataStore获得常规数据库性能是错误的吗?

我还不想打开memcache,因为我想先改进这个层而不先缓存.

kon*_*nqi 1

不完全确定您的查询应该做什么,但它看起来并不需要游标查询。以我的拙见,游标查询的唯一有效用例是对结果行数有限的数据进行分页查询。由于您的查询没有限制,我根本不明白您为什么要使用游标。

当您需要数百万个结果时,您可能正在对数据进行临时分析(因为没有人可以解释数百万个原始数据行),您最好使用 BigQuery 而不是 appengine 数据存储区。我只是在这里猜测,但对于普通的前端应用程序,您很少需要结果中的数百万行,而只需要从可用行总数中过滤出几行(有时可能是数百行)。

另一件事:

您确定是查询时间长吗?它也可能是查询的包装器。由于您使用的是游标,因此您必须重新调用查询,直到没有更多结果为止。处理这个问题的成本可能很高。

最后:

您是在 appengine 本身还是本地开发服务器上进行测试?开发服务器显然不能模拟云,因此有时可能比真实的云慢(或快)。当您的查询生成新实例时,开发服务器也不知道实例预热时间。

说到云:云数据库的特点并不是它们对很少的数据具有最佳性能,而是它们可以在数百甚至数十亿行的情况下进行扩展和一致地执行。

编辑:

执行检索操作后,应用程序可以获得游标,它是一个不透明的base64编码的字符串,标记最后检索结果的索引位置。

[...]

光标的位置定义为结果列表中最后返回结果之后的位置。光标不是列表中的相对位置(它不是偏移量);它是一个标记,当开始对结果进行索引扫描时,数据存储区可以跳转到该标记。如果查询结果在游标的使用之间发生变化,则查询只会注意到游标之后的结果中发生的变化。如果查询的光标所在位置之前出现了新结果,则在获取光标之后的结果时不会返回该结果。(数据存储查询

这两条语句使人们相信无论有没有游标查询,查询性能都应该一致。

您可能还需要检查以下一些事项:

  • 如何使用 objectify 注册实体类?
  • 您的实际测试代码是什么样的?我想看看你是如何测量以及在哪里测量的。
  • 您能分享一下游标查询和无游标查询之间的比较吗?
  • 多个请求的改进可能是 Objectify 集成缓存的结果。您可能想要禁用数据存储性能测试的缓存

  • 好吧,让我们看看你的赏金是否吸引了 Google 的一位员工。您可能还想在 objectify 支持小组中解决您的问题,Jeff 可能对此了解更多。我仍然认为您应该完全避免游标查询,并且仅将它们用于运行缓慢的后台/维护任务。 (2认同)