使用Google Cloud Datastore的登录模型的一致性

时间:2013-11-23 10:08:22

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

我正试图了解使用多种身份验证方法的登录模型。

1。)例如,当新用户尝试使用OpenID登录时,我的后端将在数据存储区中插入两个实体:

  • 插入新用户,其中自动插入的ID将是他的$ userId

    (kind: User, id: autoId)

  • 插入链接到$ userId

    的新登录信息

    (kind: AuthOpenid, name: $openId), Property(userId: $userId)

这将允许我在用户尝试登录时按键请求进行查找,这会强制执行强一致的数据,对吗?

这个想法是一个用户可以有很多登录(比如stackexchange),我不必担心写入/读取限制,因为没有实体拥有祖先,同时仍然强制执行一致性。

2.。)在相关说明中:假设我的用户在提供身份验证方法后可以选择用户名,我该如何有效地检查是否使用了用户名?

我的想法是为每个选择的用户名插入一个新实体。

  • 插入新用户名

    (kind: Username, name: $username)

现在我可以通过键请求进行查找,看看是否采用了用户名。据我所知,常见的查找无论如何都会存储在memcache中,所以这应该是有效的,对吗?

我也可以撤销该程序,只是尝试插入一个用户名,看看它是否失败。

1 个答案:

答案 0 :(得分:1)

1)你的方法看起来不错。如您所述,Lookup操作(按键查找)为guaranteed to return consistent results

你也是正确的,通过将每个AuthOpenid实体放在它自己的实体组(没有共同的祖先)中,你将避免任何特定实体组的1 write/second写入吞吐量限制(对比率没有相应的限制)实体组创建)。

2)这也可以,但是你需要在事务中执行读写操作。这可以确保如果两个用户尝试保留相同的用户名,则只有其中一个用户会成功。

在云数据存储区中,如果已存在具有相同密钥的实体,则insert突变将失败,因此这也将起作用。

(请注意,这与使用upsert语义的App Engine数据存储区中的put()操作不同。)