redis分布式鎖有兩層超時:
1 鎖等待超時
2 tcp connection超時
任一個超時未設置,都有可能造成阻塞
事故如下:
*disruptor采用阻塞模式,到最大消息池時即阻塞,導致線程阻塞
左下角,獲取redis鎖雖然使用了trylock立即返回,但是沒想到,由於斷網,redis客戶端在tcp層阻塞了,且未設置超時,阻塞隨着阻塞鏈傳遞到無界的single線程池,最終導致oom
解決方案:
1 redis部署內網,並在tcp redis鎖2個層面設置超時
2 線程池設置為有界,且配置放棄策略,這個方案雖然保障了jvm,但會有業務上的遺漏,比如行情到了,應該成交了,確被放棄了