我正在开发Lagom项目,其中一项要求是唯一标识每个用户的文档。
每次用户添加文档时,文档都会生成一个ID。
我的想法很简单,可以保证ID的唯一性:
我已实施DocumentEventProcessor extends ReadSideProcessor<DocumentEvent>
和DocumentRepository
能够查询数据库。
我的问题是如何编写迭代(递归可能)查询数据库的函数,直到新的随机ID返回。
答案 0 :(得分:0)
为什么不使用while循环?
SaveDocumentWithNewId(){
//what pseudocode.
String newRandomId = null;
while(result.size() != 0 )
newRandomId = GenerateRandomID();
ArrayList result= queryToDatabase(newRandomId);
}
document.setId(newRandomId );
}
答案 1 :(得分:0)
您不应使用读取方(即您的数据库)来保证ID的唯一性。在Lagom(以及任何基于CQRS的系统)中,读取方将始终只是最终一致。因此,您最终可能会遇到两个节点生成相同ID的情况,数据库会告诉它它不存在,因为它还没有赶上。
您需要做的是确保您可以区分新创建的未使用的PersistentEntity
,以及已经拥有与之关联的文档的PersistentEntityRegistry
。然后使用PersistentEntity
获取新生成的密钥的PersistentEntityRegistry
。如果实体已存在,则生成新密钥。如果没有,你有钥匙。
算法 - 生成新ID,直到找到未使用的ID - 保持不变,只需确保使用set doc=C:\xampp\htdocs\bot
cd "%doc%"
copy /y nul "file.php"
ECHO ^<?php echo 'This is executed via scheduler task!'; ?^> >file.php
schtasks /create /tn "Cron" /tr "C:\xampp\php\php-win.exe http://localhost/bot.php" /sc minute /mo 1
检查唯一性,而不是读取端。
答案 2 :(得分:0)
成本高昂的流程通过搜索数据库来检查生成的ID是否唯一。我建议您创建自己的 UUID(如GUID),它应该系统间唯一,并且也基于要求(即7个字符长)。
您可以通过获取系统的inetAddress并附加一个随机数来创建自己的ID,然后从中生成一个消息摘要,然后根据您的要求,您可以从中删除7个字符。
通过这样做,您将在整个系统中拥有独特的ID,并满足您的要求。
供参考click here
答案 3 :(得分:0)
也许您可以使用以下方法:
假设:
- 分布式系统,
- 7个字符长ID,
- 您可以为每个节点分配一个唯一值 - hostId(可能是主机IP的最后一位数字?)
怎么做:
- 每个节点有一个Singleton,它将生成ID,
- 通过将hostId和当前时间以毫秒级联来计算uniqueNumericID(您应该存储上次使用的时间戳,以防每毫秒需要多个ID,只需将最后一个值添加一个,直到上一个时间戳&gt; =当前时间戳)。登记/>
- 将此数值(十进制)转换为基数为62的数字(使用字符'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'并反复计算(其余的)值的模数,使用模数作为字符的索引)。
7个字符长的ID应该有足够的空间。