生產(chǎn)上之前碰到過一個(gè)沒加鎖導(dǎo)致的經(jīng)典并發(fā)的問題
1.問題現(xiàn)象
線上突然發(fā)生ERROR告警日志,xxx規(guī)則找不到,持續(xù)了2,3分鐘
2.過程
1.當(dāng)時(shí)看報(bào)錯(cuò)日志是規(guī)則A找不到,然后順著日志發(fā)現(xiàn)這個(gè)活動下已經(jīng)沒有規(guī)則A了,規(guī)則A被修改了規(guī)則B。
2.但是代碼里面還是用規(guī)則A的信息去查詢的,導(dǎo)致出錯(cuò)。
3.原因
出現(xiàn)問題的原因:因?yàn)椴l(fā)的去設(shè)置了本地規(guī)則緩存信息。
自動加載的時(shí)候先取出A,這個(gè)時(shí)候運(yùn)營剛剛好很巧的更新規(guī)則成B,然后設(shè)置本地緩存信息為B。完成這步以后規(guī)則自動緩存的就把之前取出來的A設(shè)置到本地緩存,覆蓋了B。導(dǎo)致出問題。

image.png
4.影響時(shí)間
3min,因?yàn)楸镜鼐彺娴倪^期時(shí)間是3min,過期了以后就會自動讀取正確B
5.解決原因回溯
這個(gè)出現(xiàn)的原因主要有以下幾點(diǎn):
1.更新本地緩存未加鎖。更新緩存信息的入口沒控制好,導(dǎo)致管理端修改的情況下沒用鎖,直接修改緩存信息。這是根因
2.本地緩存時(shí)間還是太長了 線上是3min,把影響范圍進(jìn)一步的擴(kuò)大了,實(shí)際這種本地緩存就應(yīng)該設(shè)置短一點(diǎn)。例如3,4秒,每個(gè)給節(jié)點(diǎn)3、4秒查一次庫對數(shù)據(jù)庫并沒有壓力