我使用下面的函数来生成UUID
UUID.randomUUID().toString()
在生产环境中,我们有50多个服务器(应用服务器-每个服务器都是一个JVM),对于落在这些服务器上的请求,作为第一步,我们生成一个UUID,它基本上唯一地标识一个事务。
我们观察到的是,在服务器6和服务器11中,生成的UUID每天至少匹配10到15条消息,这很奇怪,因为考虑到负载,即每天大约有100万笔交易,这些UUID在同一天内重复是非常奇怪的。
这是我们目前所做的
1.验证了应用程序日志-我们没有发现任何可疑之处,所有日志均正常
1.尝试在具有类似生产负载和50多台服务器的测试环境中复制此问题-但在测试环境中没有发生这种情况
1.检查了应用程序逻辑--这似乎不是问题,因为除了6和11之外的所有其他48台服务器都有相同的代码库副本,它们工作得很好,并且每个事务都生成唯一的UUID。
到目前为止,我们还没有能够跟踪这个问题,我的问题基本上是,如果有什么东西在JVM级别,我们错过了或UUID参数,我们需要设置这个一个关闭的一种问题?
4条答案
按热度按时间zujrkrfu1#
假以时日,我相信你会找到罪犯的。在此期间,有一个评论,我认为值得推广回答:
创建一个UUID服务器。它只是一个生成UUID块的过程。每个块可能包含10,000个(或任何合适的)UUID。在该过程验证每个块不包含重复项之后,该过程将该块写入磁盘。
创建另一个进程来分发UUID块。也许它只是一个web服务,当它收到请求时返回一个未使用的块。交易服务器请求一个区块,然后在创建交易时使用这些UUID。当服务器使用了分配给它的大部分UUID时,它会请求另一个块。
w8f9ii692#
我不会浪费时间去想
UUID.randomUUID()
是如何每天生成一些重复的UUID的。这种情况发生的几率微乎其微。(如果底层的RNG状态是重复的,那么生成一系列的重复是可能的,但情况似乎并非如此。)相反,应该寻找一个服务器存储的UUID可能会攻击另一个服务器存储的UUID的地方。为什么50台服务器中只有2台发生这种情况?这与尚未共享的环境和系统的详细信息有关。
b4qexyjb3#
如上所述,合法碰撞的机会是不可能的小。更有可能的是,如果值曾经以不正确的方式在对象之间传输。
对于像Java这样的按引用传递的语言,请考虑以下场景
在这种情况下,saveObject1和saveObject2将具有相同的值,因为它们都指向相同的对象引用(initObj的UUID引用)。
像这样的问题似乎比实际的UUID更可能是冲突,特别是如果你可以重现它。当然,如果它不是一直发生,那可能是更复杂的事情,比如一个罕见的竞态条件,其中initObj没有及时重新初始化,导致saveObject1和2共享相同的对象引用。
blpfk2vs4#
数据库列长度可能会限制您遇到重复的UUID