GAE Long 太长了有没有办法得到更短更长的ID?

GAE Long ID's too long is there a way to get shorter Long ID's?

在本地主机开发期间,GAE 生成的 ID 以 1 开头。

然而,在云中的真实 GAE 部署中,即使是第一个实体生成的 ID 也很长,例如 5639412304721232,是否有解决方法让第一个实体以 1、2 开头, 3..等等?

有人可能会建议使用分片计数器,是的,我已经使用过它,但是 因为应用程序可能会获得相同的计数,因为它最终是一致的。

在这种情况下,最好的解决方案是什么?

我会将密钥的标识符分配为字符串“1”、“2”、“3”...等等,从音序器生成它们。您可以使用 get_or_insert() 函数检查该实体是否已存在。

同样,您可以通过将序列号存储在实体中来使用auto-increment solution

请注意,如果您非常快速地创建大量具有连续长 ID 的实体,您可能 运行 会遇到问题。 This post 给你一个解释。

理论上可以选择自动 ID 生成策略,分散的 ID 是 default since 1.8.1,但旧的单调递增 legacy 策略将被弃用,原因在链接 post.

如果您使用的是分片计数器,则可以避免这种情况,但正如您所说,您可能会遇到其他问题。

您可以尝试使用 allocate_ds。我们使用它来为系统生成的 ID 获取更小的整数值。在 Python 中使用数据库类型:

    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)

官方 post 解释了从顺序 ID 到 'scattered' ID 的切换是 here

恢复顺序行为的说明是 here,但请注意此选项最终将被删除的警告。

'best' 解决方案取决于您的需求和原因。使用分散的 ID 可以获得更好的数据存储性能,但老实说,如果您的应用程序获取少量请求并轻度使用数据存储,您可能不会注意到太多差异。如果是这种情况,您可以使用基于一个简单实体的滚动您自己的顺序 ID,该实体具有保存当前高水印 ID 的 属性,并依靠低交易率来阻止您 运行 限制每个实体的交易数量。

在分布式系统中可靠地分发顺序 ID 而没有间隙是一项挑战。