从数据存储区appengine中的给定范围自动增加实体ID?

时间:2015-12-06 07:31:26

标签: java google-app-engine objectify

我们正在开发一个应用程序,其中表的实体ID必须以从1开始的增量顺序为每个命名空间。

我们在allocateIdRange界面中遇到了allocateIdsDatastoreService个方法,但这些ID必须手动分配,并且不会由DatastoreService本身分配。手动分配ID可能会导致多个实例出现同步问题。

任何人都可以向我提出解决这个问题的建议吗?

我们正在使用objectify 3.0进行DatastoreService操作。

1 个答案:

答案 0 :(得分:0)

我同意Tim Hoffmantx802,当他们说你应该重新考虑有关顺序ID的设计时。不久前我不得不实施非常相似的东西,因为客户强迫我们使用顺序和不间断的数字来订购号码(原因不明)。无论我们使用sharding counters(链接包含完整代码示例)作为订单号,我们都遵守了客户的意愿。分片计数器的工作方式如下:

  • 您在数据存储区中创建了几个相同类型的实体,这些实体只是计数器值
  • 通过查询该类型的所有实体并汇总其值来计算实际值
  • 当您希望增加值时,其中一个实体会随机选择并递增
  • 当前计数器值可以缓存在内存缓存中以提高性能

为什么这样做:

  • 您可能知道您对数据存储区中的每秒1个事务和实体组有限制/限制。因此,您将计数器分成多个实体并避免此限制。您期望的流量越多,您需要的碎片就越多。幸运的是,你可以随时增加分片数量。
  • 我们也知道写入与读取相比较慢。因此,构建所有分片的总和是一个快速的操作,同时增加一个分片值(写入)是缓慢的,这在使用分片计数器时不会打扰我们,因为我们有足够的时间。

<强>总结 您可以对顺序ID使用分片计数器。如果你可以避免整个顺序id困境,那将是一个更好的解决方案。