10倍請求壓力來襲,你的系統會被擊垮嗎

2021-09-28 12:41:06 字數 2575 閱讀 5191

背景介紹:

給大家簡單介紹一下這個系統的整體架構,這個系統簡單來說就是有乙個非常核心的行為,就是往mq裡寫入資料,但是這個往mq裡寫入的資料是非常核心及關鍵的,絕對不容許有丟失。

所以最初就設計了乙個降級機制,如果一旦mq中介軟體故障,那麼這個系統立馬就會把核心資料寫入本地磁碟檔案。

但是如果說在高峰期併發量比較高的情況下,接收到一條資料立馬同步寫本地磁碟檔案,這個效能絕對是極其差的,會導致系統自身的吞吐量瞬間大幅度下降,這個降級機制是絕對無法在生產環境執行的,因為自己就會被高併發請求壓垮。

因此當時設計的時候,對降級機制進行了一番精心的設計。

我們的核心思路是一旦mq中介軟體故障,觸發降級機制之後,系統接收到一條請求不是立馬寫本地磁碟,而是採用記憶體雙緩衝 + 批量刷磁碟的機制

簡單來說,系統接收到一條訊息就會立馬寫記憶體緩衝,然後開啟乙個後台執行緒把記憶體緩衝的資料重新整理到磁碟上去。

整個過程,大家看看下面的圖,就知道了。

這個記憶體緩衝實際在設計的時候,分為了兩個區域。

乙個是current區域,用來供系統寫入資料,另外乙個是ready區域,用來供後台執行緒重新整理資料到磁碟裡去。

每一塊記憶體區域設定的緩衝大小是512kb,系統接收到請求就寫current緩衝區,但是current緩衝區總共就512kb的記憶體空間,因此一定會寫滿。

current緩衝區寫滿之後,就會交換current緩衝區和ready緩衝區。交換過後,ready緩衝區承載了之前寫滿的512kb的資料。

然後current緩衝區此時是空的,可以繼續接著系統繼續將新來的資料寫入交換後的新的current緩衝區。

整個過程如下圖所示:

當然,這裡後台執行緒會有一整套完善的機制,比如說乙個磁碟檔案有固定大小,如果達到了一定大小,自動開啟乙個新的磁碟檔案來寫入資料。

隱患:

好!通過上面一套機制,即使是高峰期,也能順利的抗住高併發的請求,一切看起來都很美好!

但是,當時這個降級機制在開發時,我們採取的思路,為後面埋下了隱患!

當時採取的思路是:如果current緩衝區寫滿了之後,所有的執行緒全部陷入乙個while迴圈無限等待。

等到什麼時候呢?一直需要等到ready緩衝區的資料被刷到磁碟檔案之後,清空掉ready緩衝區,然後跟current緩衝區進行交換。

這樣current緩衝區要再次變為空的緩衝區,才可以讓工作執行緒繼續寫入資料。

但是大家有沒有考慮過乙個異常的情況有可能會發生?

就是後台執行緒重新整理ready緩衝區的資料到磁碟檔案,實際上也是需要一點時間的。

萬一在他重新整理資料到磁碟檔案的過程中,current緩衝區突然也被寫滿了呢?

此時就會導致系統的所有工作執行緒無法寫入current緩衝區,執行緒全部卡死。

給大家上一張圖,看看這個問題!

高峰請求,問題爆發:

問題就出在高峰期上了。某一次高峰期,系統請求壓力達到了平時的10倍以上。

當然正常流程下,高峰期的時候,寫請求其實也是直接全部寫到mq中介軟體集群去的,所以哪怕你高峰期流量增加10倍也無所謂,mq集群是可以天然抗高併發的。

但是當時不幸的是,在高峰期的時候,mq中介軟體集群突然臨時故障,這也是一年遇不到幾次的。

這就導致這個系統突然觸發了降級機制,然後就開始寫入資料到記憶體雙緩衝裡面去。

要知道,此時是高峰期啊,請求量是平時正常的10倍!因此10倍的請求壓力瞬間導致了乙個問題的發生。

這個問題就是瞬時湧入的高併發請求一下將current緩衝區寫滿,然後兩個緩衝區交換,後台執行緒開始重新整理ready緩衝區的資料到磁碟檔案裡去。

結果因為高峰期請求湧入過快,導致ready緩衝區的資料還沒來得及重新整理到磁碟檔案,此時current緩衝區又突然寫滿了。。。

這就尷尬了,線上系統瞬間開始出現異常。。。

典型的表現就是,所有機器上部署的例項全部執行緒都卡死,處於wait的狀態。

解決問題:

於是,這套系統開始在高峰期無法響應任何請求。後來經過線上故障緊急排查、定位和搶修,才解決了這個問題。

其實說來解決方法也很簡單,我們通過jvm dump出來快照進行分析,檢視系統的執行緒具體是卡在哪個環節,然後發現大量執行緒卡死在等待current緩衝區的地方。

這就很明顯知道原因了,解決方法就是對線上系統擴容雙段緩衝的大小,從512kb擴容到乙個緩衝區10mb。

因為緩衝區越大,就可以讓ready緩衝區被flush到磁碟檔案的過程中,current緩衝區沒那麼快被打滿。

但是這個線上故障反饋出來的乙個教訓,就是對系統設計和開發的任何較為複雜的機制,都必須要參照線上高峰期的最大流量來壓力測試。只有這樣,才能確保任何在系統上線的複雜機制可以經得起線上高峰期的流量的考驗。

Beetle進行10億次請求的壓力和穩定性測試

作為乙個通訊基礎元件,其穩定性必須進行大量的測試。因為服務必須保持不7x24不間斷地執行,任何的記憶體的持續性增長都會導致服務最終因為記憶體問題而倒下。beetle為了保證這一點在1.2的版本進行了各項優化,經初步測試進行大量併發的同時進行長時間壓力測試,經過十幾億次的請求應答後beetle依然保持...

照相館預約系統讓你的工作效率提公升10倍

提公升效率提公升零 移動端管理 手機端管理及許可權管理,實現常用功能在手機端操作即可,節省大量的時間。目前實現手機端管理功能有 1 滿意度平均分統計及滿意度點評展示 2 編輯訂單 搜尋訂單 新增訂單 更改檔期等功能 3 銷售額統計,計算總銷售量和指定員工的銷售額。4 管理收支 新增收支。收支有兩種,...

如何讓你的ASO優化效果提公升10倍?

我們在做aso優化之前,需要對aso優化有清晰的認識,對於aso優化的基本概念,不清楚的朋友可以看看什麼是aso優化 兩篇文章,對aso優化做一些詳細的了解。好的運營才能留住使用者。做好aso優化能夠帶來大量的自然使用者,這個時候就需要好的運營來留住這些使用者。我們可以策劃一些活動來帶動使用者的積極...