我有一个Google PubSub主题,用于发布对象。 我的服务正在侦听该主题(4个线程),进行一些转换,然后将结果写入数据库。服务而不是数据库也会为该结果分配一个ID(URN)。
URN生成为"urn:namespace:name:${UUID.randomUUID()}"
很长一段时间后阅读主题时:
17-02-2019 17:41:55.657 [pool-2-thread-3] ERROR o.h.e.jdbc.spi.SqlExceptionHelper.logExceptions - ERROR: duplicate key value violates unique constraint "name_entity_pkey"
Detail: Key (id)=(urn:namespace:name:d7543a6b-6d09-4df2-b9af-66821e0a8423) already exists.
17-02-2019 17:41:55.657 [pool-2-thread-1] ERROR o.h.e.jdbc.spi.SqlExceptionHelper.logExceptions - ERROR: duplicate key value violates unique constraint "name_entity_pkey"
Detail: Key (id)=(urn:namespace:name:d7543a6b-6d09-4df2-b9af-66821e0a8423) already exists.
两个UUID 可能都是在同一微秒内生成的,有趣的是,该异常表明该UUID也是在过去(约2019-02-17T08:23:30.972695+01:00
时生成的)
虽然我可以理解,如果所有参数(时间)也都相同(它们应该至少相差十亿分之一秒),randomUUID()
会生成相同的UUID,但是从我看来在这里做碰撞的频率更高。
所以我的问题是:是否存在我不知道的陷阱或任何更随机的实现?
我使用openJDK-11。