Google应用引擎过多的小型数据存储操作

时间:2011-11-11 19:23:26

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

我在使用Google应用引擎数据存储时遇到了一些问题。自从推出新的定价模型以来,运行我的应用程序的成本大幅增加。

罪魁祸首似乎是“数据存储小型运营”,每天运营量超过2000万次!

有没有人遇到这个问题,我认为我没有进行过多的密钥查找,而且我只有5000个用户,每分钟大约有10-20个请求。

提前致谢!

修改

好了一些统计数据,这些数据是在3小时之后。以下是我在仪表板中的结算部分中看到的内容: Appengine dashboard - billing

以下是一些统计数据:

Stats

显然,有很多对datastore.get的调用。我开始认为这是我的设计引起的问题。这些与账户相对应。每个用户都有一个帐户,但帐户可以是两种类型之一,为此我使用了合成。因此,每个帐户实体都有一个指向其子帐户实体的链接。 因此,当我搜索附近的用户时,它涉及使用查询获取帐户,然后对每个帐户进行获取以获取其子帐户。统计图片中的最高请求是获得100个帐户的调用,然后必须对每个帐户执行get。我原以为这是一个非常轻松的查询,但我猜不是。我仍然对我的仪表板中记录的数据存储区小操作数量感到困惑。

4 个答案:

答案 0 :(得分:11)

正如Drew建议的那样,绝对使用appstats;无论您使用哪个库,它都会告诉您处理程序正在执行哪些操作。最有可能的罪魁祸首是仅限密钥的查询和计数操作。

答案 1 :(得分:9)

我的建议是使用AppStats(Python / Java)来分析您的流量并确定哪个处理程序正在生成最多数据存储操作。如果您在此处发布代码,我们可以建议进行优化。

答案 2 :(得分:1)

请勿扫描数据存储区,尽可能多地使用get(key)或get_by_id(id)或get_by_key_name(keyname)。

答案 3 :(得分:1)

您的模型中有很多ReferenceProperty属性吗?访问它们将触发每个属性的db.get,除非您预取它们。这将触发101个db.get请求。

class Foo(db.Model):
   user = db.ReferenceProperty(User)

foos = Foo.all().fetch(100)
for f in foos:
  print f.user.name  # this triggers db.get(parent=f, key=f.user)