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

标签 java google-app-engine objectify

我们正在开发一个应用程序,其中每个命名空间的表实体 ID 必须按从 1 到依此类推的递增顺序排列。

我们遇到了allocateIdRange , allocateIds DatastoreService中的方法接口(interface),但这些 id 必须手动分配,并且不会由 DatastoreService 本身分配。手动分配 ids 可能会导致多个实例的同步问题。

有人可以给我提供解决这个问题的建议吗?

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

最佳答案

我同意Tim Hoffmantx802当他们说你应该重新考虑关于顺序 id 的设计时。然而不久前,我不得不实现一些非常类似的东西,因为客户强制我们使用连续且不间断的数字作为订单号(出于不清楚的原因)。不管怎样,我们通过使用sharding counters来满足客户的意愿。 (链接包含完整的代码示例)的订单号。分片计数器的工作原理如下:

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

为什么这有效:

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

总结: 您可以对连续 id 使用分片计数器。如果您可以避免整个顺序 id 困境,那么这将是一个更好的解决方案。

关于java - 自动增加数据存储区appengine中给定范围的实体ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34115121/

相关文章:

python - Python中如何有效保存引用的类类型? (应用引擎)

java - 使用 Objectify 注册多个类

java - 使用 Objectify4 持久化 map

java - 了解 java 字符串中包含的文本是否包含 UTF-8 编码字符的最佳方法

java - 在java中可靠地卸载dll

google-app-engine - 通过 REST API 对 Firebase 进行身份验证的 API 访问

java - 安装 Google App Engine 插件 Eclipse Indigo 时出错

objectify - 仅返回在 Objectify 中列表字段为空的实体

java - 如何使用通用类通过 maven 从 xsd 生成 JAXB

java - 如何解决 "WebSphere API classes are not available"?