繁体   English   中英

为实体生成唯一ID

[英]Generate a Unique ID for an entity

我正在从事Lagom项目,其中一项要求是唯一标识每个用户的文档。

文档具有一个ID,每次用户添加文档时我应该生成一个ID。

我的想法很简单,可以保证ID的唯一性:

  • 产生随机字串ID(NOT UUID)
  • 在数据库中查询生成的ID
  • 如果查询返回0次匹配,则ID是唯一的,我应该将其返回给调用方
  • 如果查询返回1次命中,则重复所有步骤。

我已经实现了DocumentEventProcessor extends ReadSideProcessor<DocumentEvent>DocumentRepository以便能够查询数据库。

我的问题是如何编写迭代地(递归地)查询数据库直到返回新的随机ID的函数。

为什么不使用while循环?

SaveDocumentWithNewId(){
//what pseudocode. 
String newRandomId = null;
while(result.size() != 0 )
newRandomId = GenerateRandomID();
ArrayList result= queryToDatabase(newRandomId);
}

document.setId(newRandomId );
}

您不应使用读取端(即数据库)来保证ID的唯一性。 在Lagom(以及与此相关的任何基于CQRS的系统)中,读取端始终只会最终保持一致。 因此,您可能会遇到以下情况:两个节点生成相同的ID,并且数据库会告知这两个ID不存在,因为尚未被捕获。

相反,您需要做的是确保可以区分一个新创建的,未使用的PersistentEntity和一个已经与之关联的文档。 然后,使用PersistentEntityRegistry获取新生成的密钥的PersistentEntity 如果该实体已经存在,请生成一个新密钥。 如果没有,则您拥有密钥。

该算法-生成新的ID,直到找到未使用的ID-保持不变,只需确保使用PersistentEntityRegistry来检查唯一性,而不是读取端。

通过搜索数据库来检查生成的ID是否唯一,这是一个昂贵的过程 我建议您创建自己的UUID(如GUID) ,该UUID 在整个系统中应该是唯一的,并且还基于要求(即7个字符长)。

您可以通过获取系统的inetAddress并为它附加一个随机数,然后从中生成一个消息摘要来创建自己的ID,然后根据需要从中裁剪出7个字符。

这样,您将在整个系统中拥有唯一的ID,并满足您的要求。

供参考, 请点击这里

也许您可以使用以下方法:

假设:
-分布式系统,
-7个字符长的ID,
-您可以为每个节点分配一个唯一值-hostId(也许是主机IP的最后几位?)

该怎么办:
-每个节点都有Singleton来生成ID,
-通过连接hostId和当前时间(以毫秒为单位)来计算uniqueNumericID(您应该存储上次使用的时间戳,以防万一毫秒需要多个ID,请在最后一个值之前加上一个,直到最后一个时间戳> =当前时间戳)。
-将此数字值(十进制)转换为基数为62的数字(使用字符'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',并反复计算(其余)值的模数,使用模数作为字符的索引)。

您的7个字符长的ID中应该有足够的空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM