问题描述:我们使用一个SecureRandom.getInstanceStrong() 获取random对象,来生成16位的随机数,然而在生成过程中每次生成pod里面日志看需要将近两分钟生成一个数,这个问题在我本地、预生产、线上都没有问题,只有测试有这个问题。一些是在关键位置打印日志发现的问题
针对整个问题,我们只需要一个唯一标识的字符串,我使用雪花算法代替--临时解决
----------------------------------------------------------------------------------------------------------------------
问题还是要分析具体原因,具体如下:
SecureRandom.getInstanceStrong() 在linux环境下适用/dev/random生成种子,但是它下面的random是一个阻塞数字生成器,如果没有足够的随机数据提供就是一直等待,这就导致了线程的等待。这个随机数据来来自键盘、鼠标、以及磁盘活动产生的随机性生成的数据,如果这个服务缺乏磁盘的活动(linux系统下只有这个,很少会有键盘和鼠标活动)就会导致线程阻塞。
那么 Linux 中随机数是如何产生的呢 PRNG(Pseudo-Random Number Generator)
Linux 内核采用熵来描述数据的随机性,熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。内核维护了一个熵池