我已经使用祖先/实体组以及Google数据存储区每个实体组每秒写入1次的限制,了解了关于强一致性与最终一致性的许多知识。
但是,在测试中,我从未遇到异常Too much contention on these datastore entities. please try again. ,而是试图了解我是误解了这些概念还是错过了难题。
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个写入的最大值。
datastore.Get
为了测试这一点,我尝试一次创建25个用户(使用上述方法,不进行批处理),但是我没有记录任何异常 ,这意味着我应该:Google App Engine HRD-如果我超过1次写该怎么办每秒写入实体组的限制?
我想念什么?争用仅适用于查询吗?25的数量不够高吗?还是我完全错过了其他东西?
限制是针对每个实体组的,这意味着您可以创建任意数量的用户而不受限制(这是扩展的亮点),只要它们不共享同一祖先即可。
一旦开始使用用户密钥作为其他实体的祖先,事情就会发生变化,从而使它们成为同一组的一部分,从而限制了您每秒可以对其进行的更改数量。
顺便说一句,这是一个概括,很可能您每秒可以进行约5次更改,由于实体组的事务属性而存在此限制,因此存在某种类型的表,其中的更改必须按顺序执行,因此您有锁定,因此吞吐量有限。
但是,凭经验法则,您只能每秒执行1次操作,以迫使自己考虑如何在这种情况下工作。
如前所述,这仅在更新数据库,获取和查询应根据需要扩展时才有意义。