随机生成的 UUID 具有重复项

2022-09-04 04:23:58

我正在使用以下函数生成UUID

UUID.randomUUID().toString()

在生产环境中,我们有50多个服务器(应用程序服务器 - 每个服务器都是一个独立的JVM),对于落在这些服务器中的请求,作为第一步,我们生成一个UUID,它基本上唯一地标识了一个事务。

我们观察到的是,在服务器6和服务器11中,生成的UUID每天至少匹配10到15条消息,这很奇怪,因为考虑到负载即每天大约100万个事务,这些UUID在同一天内重复是非常奇怪的。

这就是我们迄今为止所做的

  1. 已验证应用程序日志 - 我们没有发现任何可疑的东西,所有日志都正常
  2. 已尝试在生产环境中负载相似且具有 50 多台服务器的测试环境中复制此问题 - 但在测试环境中未发生这种情况
  3. 检查了应用程序逻辑 - 这似乎不是问题,因为除了6和11之外,所有其他48台服务器都有相同代码库的副本,它们工作正常,并且它们为每个事务生成唯一的UUID。

到目前为止,我们还无法跟踪问题,我的问题是,基本上,在JVM级别,我们是否缺少某些东西,或者我们需要为这个问题设置UUID参数?


答案 1

假以时日,我相信你会找到罪魁祸首。与此同时,有一条评论我认为值得提拔回答:

您正在多个位置生成伪随机 UUID。如果找不到其他 Bug,请考虑在一个位置生成所有伪随机 UUID,或生成真正的随机 UUID

因此,创建一个UUID服务器。这只是一个产生UUID块的过程。每个块可能由10,000个(或任何合适的)UUID组成。在进程验证块不包含重复项后,进程会将每个块写入磁盘。

创建另一个进程来分发 UUID 块。也许它只是一个Web服务,当它收到请求时返回一个未使用的块。事务服务器发出对块的请求,然后在创建事务时使用这些 UUID。当服务器使用其分配的大部分 UUID 时,它会请求另一个块。


答案 2

我不会浪费时间想知道每天如何生成一些重复的UUID。偶然发生这种情况的几率是无限小的。(生成一系列重复项是可能的 - 如果基础 RNG 状态是重复的,但情况似乎并非如此。UUID.randomUUID()

相反,寻找一个服务器存储的UUID可能会破坏另一个服务器存储的UUID的地方。为什么这只发生在50台服务器中的2台服务器之间?这与尚未共享的环境和系统的详细信息有关。