UUID随机生成有重复项

问题描述 投票:10回答:2

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

UUID.randomUUID().toString()

在生产中,我们有50多台服务器(应用程序服务器 - 每台服务器本身就是一台JVM)以及落在这些服务器上的请求,作为第一步,我们生成一个基本上唯一标识事务的UUID。

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

这是我们迄今为止所做的

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

到目前为止,我们还没有能够追踪这个问题,我的问题基本上是在JVM级别有什么东西我们缺少或者我们需要为这个问题设置的UUID参数?

java random jvm uuid production
2个回答
4
投票

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

您正在多个位置生成伪随机UUID。如果您没有找到其他错误,请考虑在一个位置生成所有伪随机UUID,或生成实际随机UUID

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.