Google数据存储区 - 每个实体组限制不会看到每秒写入1次

时间:2015-02-27 21:53:20

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

我已经阅读了很多关于强大与最终一致性,使用祖先/实体组以及每个实体组每秒写入数据存储限制的数据。

然而,在我的测试中,我从未遇到异常Too much contention on these datastore entities. please try again. ,并试图了解我是否误解了这些概念或错过了一个难题。

我正在创建这样的实体:

func usersKey(c appengine.Context) *datastore.Key {
    return datastore.NewKey(c, "User", "default_users", 0, nil)
}

func (a *UserDS) UserCreateOrUpdate(c appengine.Context, user models.User) error {

    key := datastore.NewKey(c, "User", user.UserId, 0, usersKey(c))
    _, err := datastore.Put(c, key, &user)

    return err
}

然后用datastore.Get阅读它们。我知道因为我按键进行查找而没有阅读问题,但是如果我有大量用户创建和更新他们的信息,理论上我理论上每秒最多会写入1次写入

为了测试这个,我试图一次创建25个用户(使用上述方法,没有批处理),但我没有记录任何异常,这个帖子暗示我应该: Google App Engine HRD - what if I exceed the 1 write per second limit for writing to the entity group?

我错过了什么?争用仅适用于查询,25不是足够高的音量,还是我完全错过了其他内容?

3 个答案:

答案 0 :(得分:4)

来自文档:

  

App Engine会将写入单个实体组的序列化   数据存储,因此对更新数据存储的速度有限制   实体组。一般来说,这可以在1到5之间   每秒更新;一个好的指导方针是你应该考虑的   重新架构,如果您希望实体组必须维持更多   超过每秒一次更新。

注意单词"延长期"。每秒1次更新基本上是最低保证吞吐量。在任何特定时刻,您都可以达到更高的水平,但Google警告您不要设计这些级别始终可用。

答案 1 :(得分:3)

限制是每个实体组,这意味着您可以无限制地创建尽可能多的用户(缩放发光的地方),只要他们不共享相同的祖先。

一旦你开始使用用户密钥作为其他实体的祖先,事情会发生变化,使它们成为同一组的一部分,从而限制你每秒可以进行多少次更改。

顺便说一下,这是一个概括,很可能你每秒可以进行~5次更改,由于实体组的事务属性,存在这种限制,因此存在某种必须进行更改的表按顺序执行,因此您必须锁定,因此吞吐量有限。

但是,经验法则认为你每秒只能做1次,以迫使自己考虑如何在这种条件下工作。

如前所述,这仅在您更新数据库时才有意义,获取和查询应根据需要进行扩展。

答案 2 :(得分:1)

我不认为你在这里遗漏任何东西。以前,我在写同一个实体组时看到了相同的限制,但最近(本周,事实上)我没有看到延迟。我愿意建议谷歌解决了这个问题,我希望有人会证明我是正确的。