0

我正在阅读有关 GAE 及其数据存储的信息。我遇到了这个问题和文章。所以我想知道我的用户是否可以被识别,比如说,通过电子邮件,当两个不同的用户尝试使用相同的电子邮件时,为所有用户使用相同的父级并将电子邮件作为密钥以解决冲突是否合理?他们的标识符?理论上,如果用户数量变大(比如 10M),可能会导致任何问题吗?从我的角度来看,gets 应该没问题,但 put 是那些被锁定的。因此,如果获得显着主导的放置(实际上仅在创建新用户时发生),我看不到任何问题。但....

Key parent = KeyFactory.createKey("parent", "users");
Key user = KeyFactory.createKey(parent, "user", "user@domain.com");

何时在 GAE 的数据存储区中使用实体组 https://developers.google.com/appengine/articles/scaling/contention

4

2 回答 2

0

我还遇到了独特的电子邮件问题,这就是我所做的:

设置一个名为“电子邮件”的“种类”,并使用用户输入的电子邮件作为字符串键。这是使字段在数据存储中具有可扩展性和唯一性的唯一方法。然后设置另一种名为“用户”的类型,并使用自动生成的 ID 获取密钥:

电子邮件

密钥:电子邮件,用户密钥:datastore.Key

用户

键:auto_id,密码:字符串,名称:字符串

在此设置中,电子邮件可用作登录名,用户也可以选择更改其电子邮件(或拥有多封电子邮件),而电子邮件在系统范围内保持唯一。)

=====================

如果您将每个用户放在同一个父级下,则它是不可扩展的。您最终会将所有数据卡在一个特定的“服务器”上,因为来自同一实体组的实体存储得很近。您最终将面临每秒 5 次写入的问题

======================

作为一般经验法则,可扩展的事物(例如用户)必须是根实体才能享受数据存储扩展能力的好处。

于 2013-07-06T02:58:22.427 回答
0

我想我已经找到了我的问题的答案。https://developers.google.com/appengine/articles/handling_datastore_errors在错误原因部分:

当您尝试太快地写入单个实体组时,会发生第一种类型的超时。对单个实体组的写入由 App Engine 数据存储区序列化,因此更新一个实体组的速度存在限制。一般来说,这可以达到每秒 1 到 5 次更新。一个好的指导原则是,如果您预计实体组必须在较长时间内维持每秒一次以上的更新,您应该考虑重新架构。回想一下,实体组是一组具有相同祖先的实体——因此,没有子实体的实体是它自己的实体组,并且此限制也适用于对单个实体的写入。有关如何避免数据存储争用的详细信息,请参阅避免数据存储争用。事务期间发生的超时错误将作为 appengine.ext.db.TransactionFailedError 而不是 Timeout 引发。

于 2013-07-06T19:50:37.317 回答