【问题标题】:Is it reasonable to use the same parent key for all users in Google App Engine Datastore to transact writes?为 Google App Engine Datastore 中的所有用户使用相同的父密钥来处理写入是否合理?
【发布时间】:2013-07-05 18:05:20
【问题描述】:

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

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

When to use entity groups in GAE's Datastore https://developers.google.com/appengine/articles/scaling/contention

【问题讨论】:

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


    【解决方案1】:

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

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

    电子邮件

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

    用户

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

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

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

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

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

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

    【讨论】:

    • 还可以考虑为电子邮件应用小写字母...如果不是这样,您最终会使用不同的键名 User@ExamPle.com 和 user@example.com。 (尽管 RFC 说用户部分可以区分大小写,但实际上没有人这样做,因为将“John”和“john”作为两个不同的电子邮件帐户会令人困惑)
    • 顺便说一句,现在我想我会按电子邮件域进行分区。这可能并不理想并且有偏见,但至少它消除了在处理 yahoo 或 hotmail 用户时锁定 gmail 用户的需要。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-04
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多