91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決JVMFullGC引發嚴重線上事故的問題

發布時間:2021-09-14 13:41:38 來源:億速云 閱讀:109 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關如何解決JVMFullGC引發嚴重線上事故的問題,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

一、業務場景介紹

先簡單說說線上生產系統的一個背景,因為僅僅是文章作為案例來講,所以弱化大量的業務背景。

簡單來說,這是一套分布式系統,系統A需要將一個非常核心以及關鍵的數據通過網絡請求,傳輸給另外一個系統B。

所以這里其實就考慮到了一個問題,如果系統A剛剛將核心數據傳遞給了系統B,結果系統B莫名其妙宕機了,豈不是會導致數據丟失?

所以在這個分布式系統的架構設計中,采取了非常經典的一個Quorum算法

這個算法簡單來說,就是系統B必須要部署奇數個節點,比如說至少部署3臺機器,或者是5臺機器,7臺機器,類似這樣子。

然后系統A每次傳輸一個數據給系統,都必須要對系統B部署的全部機器都發送請求,將一份數據傳輸給系統B部署的所有機器。

要判定系統A對系統B的一次數據寫是成功的,要求系統A必須在指定時間范圍內對超過Quorum數量的系統B所在機器傳輸成功。

舉個例子,假設系統B部署了3臺機器,那么他的Quorum數量就是:3 / 2 + 1 = 2,也就是說系統B的Quorum數量就是:所有機器數量 / 2 + 1。

所以系統A要判定一個核心數據是否寫成功,如果系統B一共部署了3臺機器的話,那么系統A必須在指定時間內收到2臺系統B所在機器返回的寫成功的響應。

此時系統A才能認為這條數據對系統B是寫成功了。這個就是所謂的Quorum機制。

也就是說,分布式架構下,系統之間傳輸數據,一個系統要確保自己給另外一個系統傳輸的數據不會丟失,必須要在指定時間內,收到另外一個系統Quorum(大多數)數量的機器響應說寫成功。

這套機制實際上在很多分布式系統、中間件系統中都有非常廣泛的使用,我們線上的分布式系統也是采用了這個Quorum機制在兩個系統之間傳輸數據。

給大家上一張圖,一起來看一下這套架構長啥樣。如何解決JVMFullGC引發嚴重線上事故的問題

如上圖所示,圖中很清晰的展示了系統A和系統B之間傳輸一份數據時的Quorum機制。

接下來,我們用代碼給大家展示一下,上面的Quorum寫機制在代碼層面大概是什么樣子的。

PS:因為實際這套機制涉及大量的底層網絡傳輸、通信、容錯、優化的東西,所以下面代碼經過了大幅度簡化,僅僅表達出了一個核心的意思。

如何解決JVMFullGC引發嚴重線上事故的問題

如何解決JVMFullGC引發嚴重線上事故的問題

上面就是經過大幅精簡后的代碼,不過核心的意思是表達清晰了。大家可以仔細看兩遍,其實還是很容易弄懂的。

這段代碼其實含義很簡單,說白了就是異步開啟線程發送數據給系統B所有的機器,同時進入一個while循環等待系統B的Quorum數量的機器返回響應結果。

如果超過指定超時時間還沒收到預期數量的機器返回結果,那么就判定系統B部署的集群出現故障,接著讓系統A直接退出,相當于系統A宕機。

整個代碼,就是這么個意思!

二、問題凸現

光是看代碼其實沒啥難的,但是問題就在于線上運行的時候,可不是跟你寫代碼的時候想的一樣簡單。

有一次線上生產系統運行的過程中,整體系統負載都很平穩,本來是不應該有什么問題,但是結果突然收到報警,說系統A突然宕機了。

然后就開始進行排查,左排查右排查,發現系統B集群都好好的,不應該有問題。

然后再查查系統A,發現系統A別的地方也沒什么問題。

最后結合系統A自身的日志,以及系統A的JVM FullGC進行垃圾回收的日志,我們才算是搞清楚了具體的故障原因。

三、定位問題

其實原因非常的簡單,就是系統A在線上運行一段時間后,會偶發性的進行長時間Stop the World的JVM FullGC,也就是大面積垃圾回收。

但是,此時會造成系統A內部的工作線程大量的卡頓,不再工作。要等JVM FullGC結束之后,工作線程才會恢復運作。

我們來看下面那個代碼片段:

如何解決JVMFullGC引發嚴重線上事故的問題

但是這種系統A的莫名宕機是不正確的,因為如果沒有JVM FullGC,本來上面那個if語句是不會成立的。

他會停頓1秒鐘進入下一輪while循環,接著就可以收到系統B返回的Quorum數量的結果,這個while循環就可以中斷,繼續運行了。

結果因為出現了JVM FullGC卡頓了幾十秒,導致莫名其妙就觸發了if判斷的執行,系統A莫名其妙就退出宕機了。

所以,線上JVM FullGC導致的系統長時間卡頓,是造成系統不穩定運行的隱形殺手之一!

四、解決問題

至于上述代碼穩定性的優化,也很簡單。我們只要在代碼里加入一些東西,監控一下上述代碼中是否發生了JVM FullGC。

如果發生了JVM FullGC,就自動延長expireTime就可以了。

比如下面代碼的改進:

如何解決JVMFullGC引發嚴重線上事故的問題

通過上述代碼的改進,就可以有效的優化線上系統的穩定性,保證其在JVM FullGC發生的情況下,也不會隨意出現異常宕機退出的情況了。

看完上述內容,你們對如何解決JVMFullGC引發嚴重線上事故的問題有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江达县| 乐至县| 德保县| 百色市| 永顺县| 灵川县| 永吉县| 会理县| 中江县| 莆田市| 布尔津县| 虞城县| 香港| 平凉市| 水富县| 丰都县| 河池市| 山东| 女性| 新沂市| 武平县| 江陵县| 全南县| 南岸区| 土默特右旗| 易门县| 嘉黎县| 荣成市| 大连市| 红桥区| 紫阳县| 秭归县| 兰西县| 百色市| 惠水县| 大新县| 岱山县| 灵武市| 仪征市| 安塞县| 富裕县|