【问题标题】:What can I expect when I run out of ids on AppEngine?当我在 AppEngine 上用完 id 时会发生什么?
【发布时间】:2012-01-30 22:24:01
【问题描述】:

我永远不会创建足够多的实体来耗尽 63 位地址空间,但假设我使用 allocateIdRange 来分配 id 9223372036854775807(几乎是 2^63)。这种实体是否只是为新的、自动输入的实体而损坏?

我在一个测试应用程序中试过了。似乎 auto-IDer 的一些分片可以继续产生有效的 id,但其他分片只是给出DatastoreFailureException。成功率约为30%。会涨吗?

这实际上是一个严肃的问题,因为在我幼稚的情况下,我创建了一些相当大的 id。在达到这个限制之前,我还有数万亿个实体要做,但我注意到实体之间的 id 可以跳跃数百万,并且我以每年大约一百万的速度输入新实体。所以...我害怕达到这个限制。

【问题讨论】:

  • 你可以使用增量id,应该没问题
  • 感谢您的回复。如何使用增量 ID?在我的测试中,appengine 所做的默认分配停止工作。
  • 只要你不创建任何更大的 ID,我想你会没事的。我相信 id 之间的差距来自用于分配 id 的本地计数器中的重置。您可以想象它是如何工作的:数据存储的各种分片使用内部等效的 allocate_ids 来请求,例如100 个 id,然后将其分发给新实体;如果一个分片被杀死,它尚未分发的任何 id 将被永久保留。我你正在以每年一百万的速度生成新的 id,我认为大多数分片在死亡之前都会分发大量的 id。您可以对一个月的 id 进行采样并预测速率。
  • 我担心所有新的 id 可能都很大。自从我保留 keyrange [2^63-1, 2^63] 到现在已经有一天了,但仍然有 20 次尝试放置新实体的 12 次以 DatastoreFailureException 失败。似乎有一个分片发出 100000 大小的 id,但它出现的时间不到一半。无论哪种方式,如果我的 id 将用完,我想我至少还有一年的时间才能看到它的到来,例如,将我的所有实体重写为 id 从 1 开始的新类型。感谢您的帮助 -很高兴收到 AppEngine 工作人员的来信!
  • 我保留高键已经 2 天了,现在我 100% 的新实体结果为 DatastoreFailureException。我猜工作分片被杀死了,所有保留的只是到目前为止给出的最大 ID?

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


【解决方案1】:

通过一个测试应用程序,我使用allocateIdRange 保留了一堆非常高的 ID。起初,我尝试放置新实体的尝试中大约有一半成功了。现在,no 可以使用空白 id 放置新实体 - 每次都会引发 DatastoreFailureException。我认为这是因为密钥分配器实现不跟踪密钥中的间隙,而只跟踪迄今为止给出的最高 id。

我看不出有任何方法可以重置这种类型的计数器,所以我认为唯一的解决方案是选择一个新的 Kind 名称。

教训:不要在 2^63 附近使用 id!

【讨论】:

    猜你喜欢
    • 2018-07-07
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2016-11-11
    • 2023-01-17
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多