Google app engine 使用分片计数器值作为实体ID以保持GAE Long ID短是否好

Google app engine 使用分片计数器值作为实体ID以保持GAE Long ID短是否好,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,使用由代码生成的长值的可行性是什么。就跨数据中心拥有唯一的长id而言 为什么我需要使用计数器值作为ID?GAE生成非常长的值作为实体ID,在我的应用程序中,我需要有短的ID,就像切分计数器最初生成的ID一样 问题:分片计数器是否会在某个时刻为不同的请求生成相同的值,从而导致ID发生冲突?这是不可行的,因为分片计数器的目标是保持最终一致的计数,以帮助避免争用,同时通过除以该值来增加或减少计数器的值在不同的碎片中工作。get_count方法将汇总所有分片计数器以返回总计数,但该值不能被视为唯一id,

使用由代码生成的长值的可行性是什么。就跨数据中心拥有唯一的长id而言

为什么我需要使用计数器值作为ID?GAE生成非常长的值作为实体ID,在我的应用程序中,我需要有短的ID,就像切分计数器最初生成的ID一样


问题:分片计数器是否会在某个时刻为不同的请求生成相同的值,从而导致ID发生冲突?

这是不可行的,因为分片计数器的目标是保持最终一致的计数,以帮助避免争用,同时通过除以该值来增加或减少计数器的值在不同的碎片中工作。get_count方法将汇总所有分片计数器以返回总计数,但该值不能被视为唯一id,因为它只能确定它最终将统计您对其执行的所有增加或减少操作,因此它可以为不同的请求返回相同的值,即使每个请求都涉及一个增加操作

可以设计一种类似的方法,使用保留id池的碎片,您必须修改切分计数器的代码,但操作不会切分计数器的增加或减少,而是在预定义的一组id切分池中随机选择,并从其中一个切分池返回一个id,确保不再返回该id。每个碎片的池可以是适合您特定需要的数字范围,并且您必须管理其中一个池的保留范围用完时的情况,并且您必须再次“重新填充”


我建议看一看这篇文章,以获得解决此类问题的一些选项:

你有一个观点,但是如果应用程序根本不调用reduce操作,应用程序的所有实例是否都会发生计数冲突?(谈论GAE数据存储)问题不在于增加或减少计数器,问题是通过设计,增加或减少与get_计数断开连接(该设计允许不同碎片中的计数操作高度并发),因此,是的,您可以从get_计数返回相同的数字,使其不能作为唯一id使用。在操作数较少的情况下,您可能不会注意到这种情况,但当您同时增加试图从分片计数器获取数字的客户端时,您肯定会注意到。您将不会很好地生成自己的模型ID。如果不是现在,那么在某个时候。