【问题标题】:How to model my app in the Google App Engine Datastore如何在 Google App Engine Datastore 中为我的应用建模
【发布时间】:2011-07-28 11:55:51
【问题描述】:

我很难为我的应用程序数据建模以获得合理的性能。

这是一个跟踪一群人成本的应用程序,今天我有以下实体:

class Event(db.Model):
    # Values
    name = db.StringProperty(required=True)
    password = db.StringProperty(required=True)

class Person(db.Model):
    # References
    event = db.ReferenceProperty(Event, required=True)
    # Values
    name = db.StringProperty(required=True)

class Transaction(db.Model):
    # References
    event = db.ReferenceProperty(Event, required=True)
    paidby = db.ReferenceProperty(Person, required=True)
    # Values
    description = db.StringProperty(required=True)
    amount = db.FloatProperty(required=True)
    datetime = db.DateTimeProperty(auto_now_add=True)

# This is used because a transaction might not distribute costs
# evenly across all persons belonging to the event
class TransactionPerson(db.Model):
    # References
    event = db.ReferenceProperty(Event, required=False)
    transaction = db.ReferenceProperty(Transaction, required=True)
    person = db.ReferenceProperty(Person, required=True)
    # Values
    amount = db.FloatProperty(required=True)

问题是,例如,当我想计算每个人的余额时,我必须获取与事件关联的所有数据并循环遍历每个 Transaction/Person 组合的所有 TransactionPerson(在下面的示例中是 ~ 65.000 次操作)

我有一个事件示例:

  • 4 人
  • 76 笔交易
  • 213 交易人

然后向显示每个人的余额摘要和所有交易的起始页面请求:

真实:1863ms cpu:6900ms(实际1769ms) api: 2723ms (94ms real)

目前我只执行 3 个 RPC 请求来获取事件的所有人员、事务和事务人员,然后在应用程序中执行所有“关系”工作,这就是 cpu ms 相当高的原因。

问题:

  1. 仅从 3 个数据存储请求中获取 293 个对象需要 2723ms api cpu,这不是很高吗?实时还可以(94ms),但是我的api cpu配额占用了很多?

  2. 如何设计它以获得更好的性能?对于上面的这个例子,今天的实际 ms 是 1863,但是如果有例如 12 个人,则时间将增加三倍。这些不是可接受的响应时间。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    通常您希望针对读取进行优化。

    不是在读取时计算一个人的余额,而是在写入时计算更改并进行非规范化,将计算的余额存储在 Person 实体中。

    【讨论】:

    • 我最终使用 memcache 来存储非规范化数据并从那里获取,这大大提高了读取性能。我猜您的解决方案也可以,在读取数据和较慢的添加/写入请求时具有与我的 memcache 解决方案相同的速度优势,因为我必须在每次添加/写入时使特定事件的 memcache 无效。
    猜你喜欢
    • 2015-10-08
    • 2014-05-29
    • 2013-08-11
    • 2010-10-19
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多