我正在尝试创建大约100,000个具有相同父级的新实体(代表用户)。我读到每个实体组每秒有一个实体写入限制。我认为请求可能会超时,所以我决定使用推送队列任务将时间延长到十分钟。我尝试在推送队列任务中的for循环中使用put(),但我最终还是超时(只能编写大约8,900个实体)。
我很困惑,为什么我没有收到错误,因为我试图对同一组进行多次写入。任务在10分钟超时,这意味着我每分钟写入890次,即每秒约14次写入。这是每秒一次写入的方式..我读了Google App Engine HRD - what if I exceed the 1 write per second limit for writing to the entity group?和Google Datastore - Not Seeing 1 Write per Second per Entity Group Limitation的答案,但根据我的理解,它只是说数据存储可能每秒写5-10个实体。我得到的比率高于那个。
我还阅读了here
单个实体或实体组更新过快时会发生数据存储争用。数据存储区将并发请求排队等待轮到他们。在超时期限之后在队列中等待的请求将引发并发异常
这是否意味着尝试超过1次写入/秒时不会抛出错误?写入将被放入队列中,并且只有在请求超时发生时才会出现错误(在这种情况下,任务队列为10分钟)?
答案 0 :(得分:3)
对于在具有自动缩放功能的实例上运行的任务,您将遇到10分钟的限制。您可以将100,000个用户拆分为较小的批次,并在单独的任务中处理每个批次。
您可以对数据存储区使用批量调用,在一次调用中最多可以保存500个实体,这比单独保存每个实体要快得多。
绝对没有理由让所有用户都在同一个实体组中。这种数据模型会产生负面的性能影响 - 写入限制是有原因的。实体组是为具有3个地址或10个相册的用户而设计的,即便如此,我几乎总是避免使用父子关系,因为它们很少添加任何值,但是使代码更复杂(您始终必须知道父代到检索或保存实体)。