使用 Sharded Counter 值作为 Entity ID 以保持 GAE Long ID 简短是否好

Is it good to use Sharded Counter value as Entity ID to keep GAE Long ID short

使用由 GAE Sharded Counter 代码生成的 Long 值的可行性如何。在跨数据中心拥有唯一的 Long id 方面?

为什么我需要使用计数器值作为 ID? GAE 生成非常长的 Long 值作为实体 ID,在我的应用程序中我需要像这样的短 ID首先由 Sharded 计数器生成。

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

这是不可行的,因为分片计数器的目标是保持最终一致的计数,这有助于避免争用,同时通过将工作划分到不同的分片来增加或减少计数器的值。 get_count 方法会将所有的分片计数器累加到 return 总计数,但是这个值不能被认为是唯一的 id,因为它只能确定它最终会计算你的所有增加或减少操作对它执行,因此它可以 return 不同请求的相同值,即使每个请求都涉及增加操作。

可以设计一个类似的方法,它有一个保留 id 池的分片,你将不得不修改分片计数器的代码,而不是分片计数器的增加或减少,操作将随机 select 在一组预定义的 id 分片池中,并从其中一个 return 一个 id 并确保它不会再次被 returned。每个分片的池可以是满足您特定需求的数字范围,当其中一个池用完保留范围并且您必须再次 'refill' 时,您将不得不管理这种情况。

我建议看一下这篇文章,以获得解决此类问题的一些选项:http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram