目錄
一、事發經過
二、問題的原因
三、總結教訓
首頁 電腦教學 電腦知識 系統乾崩了,只認代碼不認人

系統乾崩了,只認代碼不認人

Feb 19, 2024 am 10:51 AM
mq 呼叫 網路問題 只認

系統乾崩了,只認代碼不認人

各位朋友聽我一句勸,寫程式碼提供方法給別人調用時,不管是內部系統調用,還是外部系統調用,還是被動觸發調用(例如MQ消費、回調執行等),一定要加上必要的條件校驗。千萬別信某些同事說的這個條件肯定會傳、肯定有值、肯定不為空等等。這不,臨過年了我就被坑了一波,弄了個生產事故,年終獎基本上是涼了半截。

我決定專注於程式碼本身,而非人,以確保系統高可用性和穩定性。以下是幾個小教訓,或許對你也有幫助。

一、事發經過

我的業務場景是:當業務A發生變化時,會觸發發送MQ訊息,然後應用程式會接收到MQ訊息,處理後將資料寫入Elasticsearch。

(1) 收到一個業務A的異常告警,當時的告警如下:

(2) 咋一看覺得有點奇怪,怎麼會是Redis異常呢?然後自己連了下Redis沒有問題,又看了下Redis集群,一切正常。所以就放過了,以為是偶然出現的網路問題。

接著,在技術問題群組裡,客服報告說部分用戶出現異常狀況,我立即檢查系統,確認偶發性問題的存在。

(4) 於是我習慣性的看了幾個核心部件:

  • 網關狀況、核心業務Pod的負載狀況、用戶中心Pod的負載狀況。
  • Mysql的情況:記憶體、CPU、慢SQL、死鎖、連線數等。

發現了慢SQL和元資料鎖定時間過長的情況,主要是由於一張大表的全表查詢導致資料量過大,執行速度緩慢,進而導致元資料鎖持續時間過長,進而耗盡資料庫連線數。

SELECT xxx,xxx,xxx,xxx FROM 一张大表
登入後複製

(6) 立刻Kill掉幾個慢會話之後,發現系統仍然沒有完全恢復,為啥呢?現在資料庫已經正常了,怎麼還沒完全恢復?又繼續看了應用程式監控,發現用戶中心的10個Pod裡面有2個Pod異常了,CPU和記憶體都爆了。難怪使用時會出現偶發性的異常呢。於是趕緊重啟Pod,先把應用程式恢復。

(7) 問題找到了,接下來就繼續排查為什麼用戶中心的Pod掛掉了。從以下幾個懷疑點開始分析:

  • 同步資料到Elasticsearch的程式碼是不是有問題,怎麼會出現連不上Redis的情況呢?
  • 會不會是異常過多,導致發送異常警報訊息的執行緒池佇列滿了,然後就OOM?
  • 哪裡會對那張業務A的大錶做不帶條件的全表查詢呢?

(8) 繼續排查懷疑點a,剛開始以為:是拿不到Redis鏈接,導致異常進到了線程池隊列,然後隊列撐爆,導致OOM了。依照這個設想,修改了程式碼,升級,繼續觀察,依舊出現同樣的慢SQL 和 使用者中心被幹爆的狀況。因為沒有異常了,所以懷疑點b也可以被排除了。

(9) 此時基本上可以肯定是懷疑點c了,是哪裡調用了業務A的大表的全表查詢,然後導致用戶中心的內存過大,JVM來不及回收,然後直接乾爆了CPU 。同時也是因為全表資料太大,導致查詢時的元資料鎖時間過長造成了連線不能夠及時釋放,最終幾乎被耗盡。

(10) 於是修改了查詢業務A的大表必要校驗條件,重新部署上線觀察。最終定位出了問題。

二、問題的原因

因為在變更業務B表時,需要發送MQ訊息( 同步業務A表的數據到ES),接受到MQ訊息後,查詢業務A表相關連的數據,然後同步數據到Elasticsearch。

但是變更業務B表時,沒有傳業務A表所需的必要條件,同時我也沒有校驗必要條件,從而導致了對業務A的大表的全表掃描。因為:

某些同事说,“这个条件肯定会传、肯定有值、肯定不为空...”,结果我真信了他!!!
登入後複製

由於業務B表當時變更頻繁,發出和消費的MQ訊息較多,觸發了更多的業務A的大表全表掃描,進而導致了更多的Mysql元數據鎖時間過長,最終連接數消耗過多。

同時每次都是把業務A的大表查詢的結果返回到用戶中心的內存中,從而觸發了JVM垃圾回收,但是又回收不了,最終內存和CPU都被乾爆了。

至於Redis拿不到連線的異常也只是個煙霧彈,因為發送和消費的MQ事件太多,瞬時間有少部分執行緒確實拿不到Redis連線。

最後我在消費MQ事件處的程式碼裡增加了條件校驗,同時也在查詢業務A表處也增加了的必要條件校驗,重新部署上線,問題解決。

三、總結教訓

經過此事,我也總結了一些教訓,與君共勉:

(1) 時時警惕線上問題,一旦出現問題,千萬不能放過,趕緊檢查。不要再去懷疑網路抖動問題,大部分的問題,都跟網路無關。

(2) 業務大表本身要做好保護意識,查詢處一定要增加必須條件校驗。

(3) 消費MQ訊息時,一定要做必要條件校驗,不要相信任何資訊來源。

(4) 千萬別信某些同事說,「這個條件一定會傳、肯定有值、肯定不為空」等等。為了保障系統的高可用和穩定,咱們只認代碼不認人。

(5) 一般出現問題時的排查順序:

  • 資料庫的CPU、死鎖、慢SQL。
  • 應用的網關和核心部件的CPU、記憶體、日誌。

(6) 業務的可觀測性和警告必不可少,而且必須要全面,這樣才能更快的發現問題和解決問題。

以上是系統乾崩了,只認代碼不認人的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Bitget Wallet交易所怎麼註冊不了是什麼原因 Bitget Wallet交易所怎麼註冊不了是什麼原因 Sep 06, 2024 pm 03:34 PM

無法註冊BitgetWallet交易所的原因有很多種,包括帳戶限制、不支援的地區、網路問題、系統維護和技術故障。要註冊BitgetWallet交易所,請造訪官方網站、填寫資訊、同意條款、完成註冊並驗證身分。

歐易交易所網路出錯怎麼辦 歐易交易所網路出錯怎麼辦 Jul 17, 2024 pm 04:25 PM

遇到歐易交易所網路出錯時,可採取以下步驟解決:檢查網路連線。清除瀏覽器快取。嘗試其他瀏覽器。禁用瀏覽器插件。聯絡歐易客服。

MEXC(抹茶)官方網站怎麼登陸不上去? MEXC(抹茶)官方網站怎麼登陸不上去? Dec 07, 2024 am 10:50 AM

無法登入MEXC(抹茶)網站的原因可能是網路問題、網站維護、瀏覽器問題、帳戶問題或其他原因。解決步驟包括:檢查網路連線、查看網站公告、更新瀏覽器、檢查登入憑證以及聯絡客服團隊。

okx登入收不到驗證碼 okx登入收不到驗證碼 Jul 23, 2024 pm 10:43 PM

登入OKX無法收到驗證碼的原因包括:網路問題、手機設定問題、簡訊服務中斷、伺服器繁忙和驗證碼請求限制。解決方案依序為:等待重試、切換網路、聯絡客服。

歐易okex登入收不到驗證碼 歐易okex登入收不到驗證碼 Jul 25, 2024 pm 02:43 PM

無法收到歐易OKEx登入驗證碼的原因及解決方法:1.網路問題:檢查網路連線或切換網路;2.手機設定:開啟簡訊接收或將歐易OKEx列入白名單;3.驗證碼傳送限制:稍後再試或聯絡客服;4.伺服器擁擠:高峰期稍後再試或使用其他登入方式;5.帳號凍結:聯絡客服解決。其他方法:1.語音驗證碼;2.第三方驗證碼平台;3.聯絡客服。

gate.io芝麻開門易所官方網站怎麼登陸不上去? gate.io芝麻開門易所官方網站怎麼登陸不上去? Aug 19, 2024 pm 04:58 PM

Gate.io芝麻開門易所官方網站無法登入的原因包括:網路問題、網站維護、瀏覽器問題、安全設定等。解決方案依序為:檢查網路連線、等待維護結束、清除瀏覽器快取、停用插件、檢查安全設定、聯絡客服。

火幣(Huobi)官方網站怎麼登陸不上去? 火幣(Huobi)官方網站怎麼登陸不上去? Aug 12, 2024 pm 04:09 PM

無法登入火幣官方網站的原因包括:檢查網路連線和清除瀏覽器快取。網站可能正在維護或更新。由於安全問題(例如IP位址被封鎖或帳戶被凍結)。輸入的網站位址錯誤。所在地區可能受限制。其他技術問題。

在使用PHP調用支付寶EasySDK時,如何解決'Undefined array key 'sign'”報錯問題? 在使用PHP調用支付寶EasySDK時,如何解決'Undefined array key 'sign'”報錯問題? Mar 31, 2025 pm 11:51 PM

問題介紹在使用PHP調用支付寶EasySDK時,按照官方提供的代碼填入參數後,運行過程中遇到報錯信息“Undefined...

See all articles