太极限了,JDK的这个BUG都能被我踩到

269b0a98b971489114a6f2e08fc1b6e1.png

若有收获,请记得分享和转发哦

之前遇到个文件监听变更的问题,刚好这周末有空研究了一番,整理出来分享给大家。

从一次故障说起

我们还是从故障说起,这样更加贴近实际,也能让大家更快速理解背景。

有一个下发配置的服务,这个配置服务的实现有点特殊,服务端下发配置到各个服务的本地文件,当然中间经过了一个agent,如果没有agent也就无法写本地文件,然后由client端的程序监听这个配置文件,一旦文件有变更,就重新加载配置,画个架构图大概是这样:c7dafc6251344fd26b0cae29a5b17c7c.png

今天的重点是文件的变更该如何监听(watch),我们当时的实现非常简单:

  • 单独起个线程,定时去获取文件的最后更新时间戳(毫秒级)

  • 记录每个文件的最后更新时间戳,根据这个时间戳是否变化来判断文件是否有变更

从上述简单的描述,我们能看出这样实现有一些缺点:

  • 无法实时感知文件的变更,感知误差在于轮询文件最后更新时间的间隔

  • 精确到毫秒级,如果同一毫秒内发生2次变更,且轮询时刚好落在这2次变更的中间时,后一次变更将无法感知,但这概率很小

还好,上述两个缺点几乎没有什么大的影响。

但后来还是发生了一次比较严重的线上故障,这是为什么呢?因为一个JDK的BUG,这里直接贴出罪魁祸首:1b8f31f4b3bee81b2764e47fb0bea60b.png

7b14efb0e79adb5191e0d4a1bbc3c0bc.png

eb910a4255680172aa11adcc34c5fb0e.png

jdk_11.0.6

c873f5cd3798e6df688e2a8c9835d750.png

4899775452cbd59696a3e084d8b2798c.png

cba7c3983ee4b105dc7b3071f90b4e85.png

fd614c05fce562e735ba001479c89fc3.png

b7845ae987a749b4adf81bb9b894493a.png

4c72033e70fac3a8d834a5714049cc45.png

8c23056bed12dcb1e9abda9eb2aca218.png

每隔一段时间(默认为10s)去poll下,这个poll干了什么?代码太长,我截出关键部分:

9e30cb17f711e83c3dee09cb0a1dd0fb.png

2b5ee4c03879a803f17fef160bdc634e.png

0faca19918cb9f0db386e24a245a53db.png

75765ab25b442c6e5cdcaed31f853593.png

0b0114decf4102b3fbf8845262fb5476.png

9856985a41dbfc453e70965c1e62cd3a.png

dbbe89c7d823c217fe5435c046f23d1b.png

bf8544d773e245d5ce172f88e5144950.png

788b4111d0de083e0c4d00c4ee922f14.png

48362d6947504f6771f4cc7ece321e34.png

dbdea1554d2f77d76dff851fb2b780c6.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值