我们正在开发一个应用程序,其中每个命名空间的表实体 ID 必须按从 1 到依此类推的递增顺序排列。
我们遇到了allocateIdRange , allocateIds DatastoreService中的方法接口(interface),但这些 id 必须手动分配,并且不会由 DatastoreService 本身分配。手动分配 ids 可能会导致多个实例的同步问题。
有人可以给我提供解决这个问题的建议吗?
我们使用 objectify 3.0 进行 DatastoreService 操作。
最佳答案
我同意Tim Hoffman和 tx802当他们说你应该重新考虑关于顺序 id 的设计时。然而不久前,我不得不实现一些非常类似的东西,因为客户强制我们使用连续且不间断的数字作为订单号(出于不清楚的原因)。不管怎样,我们通过使用sharding counters来满足客户的意愿。 (链接包含完整的代码示例)的订单号。分片计数器的工作原理如下:
- 您在数据存储区中创建了几个相同类型的实体,它们只是计数器值
- 实际值是通过查询该类型的所有实体并汇总其值来计算的
- 当您希望增加值时,会随机选择其中一个实体并递增
- 当前计数器值可能会缓存在内存缓存中以提高性能
为什么这有效:
- 您可能知道,数据存储区中存在每秒 1 个事务和实体组的限制。因此,您可以将计数器分成多个实体并避免此限制。您期望的流量越多,您需要的分片就越多。幸运的是,您可以随时增加分片数量。
- 我们还知道,与读取相比,写入速度较慢。因此,构建所有分片的总和是一个快速操作,而增加单个分片值(写入)则很慢,这在使用分片计数器时不会打扰我们,因为我们有足够的时间。
总结: 您可以对连续 id 使用分片计数器。如果您可以避免整个顺序 id 困境,那么这将是一个更好的解决方案。
关于java - 自动增加数据存储区appengine中给定范围的实体ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34115121/