经过几天阅读应用引擎和数据存储的文档后,我似乎无法理解如何构建真实的可扩展应用程序。
我也找不到最佳实践的好例子。确定我可以使我的应用程序工作,但我不知道扩展到我的开发环境可以提供的负载以上是否有任何好处。
它明确指出app-engine tutorial of using the datastore:“但是,您可以写入同一实体组的速率限制为每秒写入实体组。当你设计一个真正的应用程序时,你需要记住这个事实。“
我假设我理解的内容(请纠正我,如果我错了),因为数据存储根是/ then / Users / * (Keys)是一个实体组和/ Products / Beauty / *是一个实体组,它受到每秒1次写入的先前限制的影响。 (是/产品/美容/ *受限于/ Products / *以及?)
我是否想念这个?
让我们假设我们想要构建一个真实的聊天应用程序或购物应用程序。这些应用程序必须存储用户将在应用程序上执行的许多操作的数据。比如发送消息或评论产品或删除/添加/编辑产品。
鉴于这些操作,数据存储应该如何?当然,我们无法将消息存储为/ Messages / {Message,To,From,Timestamp},因为许多用户将发送必须写入此密钥的消息。另一种方法是每秒限制用户每1条消息并将其存储在他的配置文件/ Users / {USER} / {Message,To,From,Timestamp}中,但只有一个用户可以写入该实体组。所以我们可以把它们放在根目录上:/ {USER} / {Message,To,From,Timestamp}但是它被认为是一个好习惯吗?是否足够快速查询数据存储区以获取用户之间的所有消息? (有效吗?可能?)
另一种方法是将所有内容存储在数据存储区的根目录中,作为“消息”和“用户”,“产品”和“类别”(例如,产品中将包含类别引用)。
I found these代码示例,但我没有工具或想法如何知道这些是否是规模化的良好做法?
谢谢!
答案 0 :(得分:5)
你在想错了。您的密钥路径不是/ Users / *(密钥)
但是一组('User',somekey)键,在这种情况下的用户是Kind(表示实体类型)。在这种情况下,每条记录都是它自己的实体组的根。
你只会保持深层钥匙链(祖先)对你拥有的关系有非常严格的要求。
我的应用程序超过2000个用户。和课程材料。每个用户都是拥有它的自己的实体组;自己的结果,对课程材料的关键参考培训实体拥有的每个课程都在同一个实体组中(不需要高写率),我们认为没有理由为什么不会扩展到数百万用户。当我们从100开始时,性能已经很好地扩展了。 2000位用户。
答案 1 :(得分:5)
通常,仅当您需要单个组中的实体的事务和/或强一致性时才使用实体组。并且数据存储区没有给出“根”。
让我们以照片应用为例。添加新用户时,每个用户实体都会成为自己的“实体组”,因为它没有(也不需要)父实体。这意味着您可以根据需要每秒添加任意数量的用户。
添加新相册时,您可以将其设置为用户实体的子实体,也可以在不指定父实体的情况下添加它,只需在其某个属性中引用用户即可。如果您决定在用户和相册之间使用父子关系,则每个用户每秒只能添加一个相册。在现实生活中,用户无法快速添加相册。
App Engine的可扩展性是其主要功能。开始构建您的应用程序,或研究其中一个教程/示例应用程序,其中许多数据建模概念将变得清晰。