Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 当AppEngine上的ID用完时,我能期待什么?_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Google app engine 当AppEngine上的ID用完时,我能期待什么?

Google app engine 当AppEngine上的ID用完时,我能期待什么?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我永远不会创建足够的实体来耗尽63位地址空间,但假设我使用allocateIdRange来分配id 9223372036854775807(几乎是2^63)。这种实体是否刚刚被自动输入的新实体打破 我在一个测试应用程序中尝试了这一点。似乎auto-IDer的一些碎片可以继续生成有效的ID,但其他碎片只会给出一个DatastoreFailureException。成功率约为30%。它会涨吗 这实际上是一个严肃的问题,因为在我的天真中,我创建了一些相当大的ID。在达到这个极限之前,我还有数万亿个实体

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

我在一个测试应用程序中尝试了这一点。似乎auto-IDer的一些碎片可以继续生成有效的ID,但其他碎片只会给出一个
DatastoreFailureException
。成功率约为30%。它会涨吗


这实际上是一个严肃的问题,因为在我的天真中,我创建了一些相当大的ID。在达到这个极限之前,我还有数万亿个实体要去,但我注意到ID在实体之间可以跳跃数百万,我以每年大约一百万的速度进入新的实体。所以我害怕达到这个极限。

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

我看不到任何重置此类计数器的方法,因此我认为唯一的解决方案是选择一个新的
Kind
名称


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

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