【发布时间】: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