一尘不染

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

go

我已经使用祖先/实体组以及Google数据存储区每个实体组每秒写入1次的限制,了解了关于强一致性与最终一致性的许多知识。

但是,在测试中,我从未遇到异常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-如果我超过1次写该怎么办每秒写入实体组的限制?

我想念什么?争用仅适用于查询吗?25的数量不够高吗?还是我完全错过了其他东西?


阅读 169

收藏
2020-07-02

共1个答案

一尘不染

限制是针对每个实体组的,这意味着您可以创建任意数量的用户而不受限制(这是扩展的亮点),只要它们不共享同一祖先即可。

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

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

但是,凭经验法则,您只能每秒执行1次操作,以迫使自己考虑如何在这种情况下工作。

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

2020-07-02