我已经阅读了很多关于强大与最终一致性,使用祖先/实体组以及每个实体组每秒写入数据存储限制的数据。
然而,在我的测试中,我从未遇到异常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不是足够高的音量,还是我完全错过了其他内容?
答案 0 :(得分:4)
来自文档:
App Engine会将写入单个实体组的序列化 数据存储,因此对更新数据存储的速度有限制 实体组。一般来说,这可以在1到5之间 每秒更新;一个好的指导方针是你应该考虑的 重新架构,如果您希望实体组必须维持更多 超过每秒一次更新。
注意单词"延长期"。每秒1次更新基本上是最低保证吞吐量。在任何特定时刻,您都可以达到更高的水平,但Google警告您不要设计这些级别始终可用。
答案 1 :(得分:3)
限制是每个实体组,这意味着您可以无限制地创建尽可能多的用户(缩放发光的地方),只要他们不共享相同的祖先。
一旦你开始使用用户密钥作为其他实体的祖先,事情会发生变化,使它们成为同一组的一部分,从而限制你每秒可以进行多少次更改。
顺便说一下,这是一个概括,很可能你每秒可以进行~5次更改,由于实体组的事务属性,存在这种限制,因此存在某种必须进行更改的表按顺序执行,因此您必须锁定,因此吞吐量有限。
但是,经验法则认为你每秒只能做1次,以迫使自己考虑如何在这种条件下工作。
如前所述,这仅在您更新数据库时才有意义,获取和查询应根据需要进行扩展。
答案 2 :(得分:1)
我不认为你在这里遗漏任何东西。以前,我在写同一个实体组时看到了相同的限制,但最近(本周,事实上)我没有看到延迟。我愿意建议谷歌解决了这个问题,我希望有人会证明我是正确的。