【问题标题】:Datastore: Multiple writes against an entity group inside a transaction exceeds write limit?数据存储:对事务内的实体组的多次写入超出了写入限制?
【发布时间】:2016-07-09 01:02:17
【问题描述】:

我熟悉 Datastore 对实体组的每秒单次写入限制(好的,可能是 5 次)。这与交易有何关系?

文档似乎表明我可以在事务中进行多项修改——例如添加几个后代实体:

单个事务可以修改单个组中的多个实体, 或通过将新实体的父级设为 组中的现有实体。

https://cloud.google.com/appengine/docs/java/datastore/transactions

【问题讨论】:

  • 从技术上讲,每个实体组每秒写入 1 个事务,其中单个实体组的事务最多可以有 500 个实体。这意味着您最多可以每秒将 500 个实体写入单个实体组。另请注意,您可以每秒一次达到更高的峰值,但如果您坚持下去,则会增加发生争用的风险以及系统的最终一致性。
  • @DanMcGrath:嗯,这应该在文档中说明...
  • @DanCornilescu,我们正在积极努力改进它。例如,在我们的新限制文档中,您会更清楚地看到它:cloud.google.com/datastore/docs/concepts/limits
  • @DanMcGrath:太好了,谢谢!
  • 谢谢,我与 Datastore 团队进行了交谈,也确认了这一点。

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


【解决方案1】:

是的,您可以在同一个事务中为每个实体组执行多个写入操作,但要小心:

  • 注意不要在同一个事务内部有写入导致冲突,否则事务最终会失败(即使在重试之后)
  • 尝试将每个事务中的写入量保持在较低水平,或以某种方式确保事务之间有足够的时间间隔,以使总写入操作率(或更确切地说是其短期平均值)保持(远)低于 1 次写入/秒的限制 - 以为瞬时峰值和偶尔重试的失败留出空间,这些失败也会影响该限制。否则你会得到并发/争用异常。见Objectify - many writes to same entity in short period of time with and without transaction

当然,您可以在跨组事务中写入最多 25 个实体组(此时)(每个都有自己的 ~1 写入/秒限制,总计高达 ~25 次写入/秒)。

在最终一致性和写入吞吐量之间取得适当的平衡并非易事。这可能感兴趣:What would be the purpose of putting all datastore entities in a single group?

更新 DanMcGrath 的评论:

从技术上讲,每个实体组每秒写入 1 个事务, 单个实体的事务最多可以有 500 个实体 团体。这意味着您每秒最多可以写入 500 个实体 到一个单一的实体组。另请注意,您可以一次达到更高的峰值 第二,虽然如果你坚持下去,你会增加被击中的风险 争用以及系统的最终一致性。 – 丹 麦格拉思 1 小时前

【讨论】:

猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 2018-08-18
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多