在本地主机开发期间,GAE生成的ID从1开始。
然而,在云中的真实GAE部署中,即使对于第一个实体生成的ID也很长,例如5639412304721232
,是否有解决方案使第一个实体以1,2,3开始..等等?
有人可能会建议使用Sharded Counters,是的我已经使用了这个,但some suggests that sharded counters are not to be used因为app可能得到相同的数量,因为它最终是一致的。
在这种情况下,什么是最好的解决方案?
答案 0 :(得分:3)
正式帖子解释了从顺序到'分散'ID的转换是here。
恢复顺序行为的说明是here,但请注意最终将删除此选项的警告。
“最佳”解决方案取决于您的需求和原因。使用分散的ID,您将获得更好的数据存储性能,但老实说,如果您的应用程序获取少量请求并轻松使用数据存储区,您可能不会注意到太多差异。如果是这种情况,您可以使用基于具有保存当前高水位ID的属性的简单实体来滚动您自己的顺序ID,并依赖于具有低事务率以防止您遇到事务数量限制每个实体。
可靠地在分布式系统中无间隙地发布顺序ID非常具有挑战性。
答案 1 :(得分:2)
请注意,如果您使用连续的长ID快速创建大量实体,则可能会遇到问题。 This post为您解释原因。
理论上,可以选择自动ID生成策略,分散的ID为default since 1.8.1,但由于链接中讨论的原因,旧的单调递增legacy
策略将被弃用交。
如果你使用分片计数器,你会避免这种情况,但正如你所说,你可能会遇到其他问题。
答案 2 :(得分:2)
您可以尝试使用allocate_ds。我们使用它来获取系统生成的id的较小整数值。在Python中使用db类:
model_key = db.Key.from_path('your_kind_name', 1)
key_batch = db.allocate_ids(model_key, 1)
id_new = key_batch[0]
idkey = db.Key.from_path('your_kind_name', id_new)
答案 3 :(得分:1)
我会将密钥的标识符指定为字符串“1”,“2”,“3”......等等,从序列发生器生成它们。您可以检查实体是否已存在get_or_insert()函数。
同样,您可以通过在实体中存储序列号来使用auto-increment solution。