分配一个随机 ID 以在实体构造函数中使用 Google App Engine

Allocate a random Id to use in Entity constructor Google App Engine

当您使用 @id Long id; 属性 将实体插入数据存储时,数据存储会自动创建一个随机(或看起来像随机的)长值作为 id,如下所示:5490350115034675.

我想自己设置 Long ID,但它是从数据存储中随机生成的。

我发现这段代码似乎就是这样做的:

 Key<MyEntity> entityKey = factory().allocateId(MyEntity.class);
 Long commentId = entityKey.getId();

然后我可以将 commentId 传入 MyEntity 的构造函数,然后将其保存到数据存储区。

然而,当我这样做时,我似乎没有得到随机生成的 ID,它似乎遵循某种奇怪的模式,其中第一个分配的 ID 是 1,下一个是 10002 , 然后是 20001 等等。

不确定这意味着什么以及继续使用是否安全...这是唯一的方法吗?

App Engine 使用其自己旨在提高数据存储性能的内部算法分配 ID。我相信 App Engine 团队会发挥他们的魔力。

引入您自己的 ID 分配方案并不那么简单 - 您必须考虑最终一致性等问题。您不太可能从所有这些努力中获得任何收益,performance-wise。

当您使用自动生成的 ID(即 Long)时,GAE 使用 'scattered' ID 生成器为您提供来自广泛的键空间的 ID。这是因为索引中 more-or-less 连续值的大量写入(每秒数千次)会导致大量 table 拆分,从而损害性能。

当您使用 allocateId() 时,您会从分散 ID 之前使用的旧分配器中获得一个 ID。它们不一定是连续的或单调的,但它们往往从小到大开始。

你可以混搭;分配永远不会冲突。

不过,我认为您需要 random-looking ID 是因为您希望它们难以被猜到。尽管乍一看,分散的 ID 分配器不会产生无法猜测的 ID。如果你想要稀疏的 id 来防止有人扫描你的键空间,你需要显式地添加一个随机元素。或者首先使用 UUID.randomUUID()。