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

Google Datastore - Not Seeing 1 Write per Second per Entity Group Limitation

我读了很多关于强一致性与最终一致性的文章,使用祖先/实体组,以及 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 个用户(使用上述方法,没有批处理),但我没有记录任何异常,这post 意味着我应该:Google App Engine HRD - what if I exceed the 1 write per second limit for writing to the entity group?

我错过了什么?争用是否仅适用于查询,25 是否不够高,还是我完全遗漏了其他东西?

限制是针对每个实体组的,这意味着您可以不受限制地创建任意数量的用户(这就是扩展的优势所在),只要他们不共享同一祖先即可。

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

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

不过,经验法则是认为你每秒只能做 1 次,以强迫自己思考在这种情况下如何工作。

如前所述,这仅在您更新数据库时相关,获取和查询应根据需要扩展。

来自文档:

Writes to a single entity group are serialized by the App Engine datastore, and thus there's a limit on how quickly you can update one entity group. In general, this works out to somewhere between 1 and 5 updates per second; a good guideline is that you should consider rearchitecting if you expect an entity group to have to sustain more than one update per second for an extended period.

注意单词 "extended period"。每秒 1 次更新基本上是最低保证吞吐量。在任何给定时刻,您都可以达到更高的级别,但 Google 警告您不要为这些级别构建始终可用的架构。

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