2020年的春節與往年不同,突如其來的新型冠狀病毒肺炎自華中始,并向全國各地蔓延,沖淡了原有年味兒的喜慶熱鬧。從23号武漢封城,到多地紛紛效仿,最後到一級響應預警,全國各地都是嚴陣以待。面對嚴峻疫情防控形勢,社會各界齊心協力抗擊疫情,好雨科技也積極投入到抗擊疫情的實際行動中。
鹹陽市大資料管理局是鹹陽市政府下屬機構,負責鹹陽全市資訊化建設、大資料管理和資訊網絡運作維護等工作。2019年,鹹陽大資料管理局以Rainbond為基座,建設鹹陽市的智慧社會作業系統,智慧社會作業系統的主要任務是連接配接資源、連接配接應用、連接配接資料、連接配接使用者,2019年底已經完成智慧社會作業系統的主體建設工作。
挑戰
2月4日,由于複工返崗高峰的到來,大規模的人口流動重新啟動,為遏制疫情蔓延擴散,做好外來返勞工員的防控和服務工作,鹹陽市大資料需要用最短的時候完成鹹陽市疫情登記應用和相關管控應用的開發和上線,并在3天内完成整個鹹陽市130萬人資訊上報和管控服務。
在這過程中面對兩大個挑戰:
- 鹹陽大資料管理局的從業人員也在家辦公,疫情防控應用必須在短時間開發完成,需要高效的遠端協作,并支撐應用快速疊代上線和業務不間斷更新。
- 應用要支撐130萬人短時間通路要求,在某些時間點會有大量并發,需要快速完成性能優化,支撐大并發。
通過Rainbond實作遠端協作、快速疊代開發和持續傳遞
疫情來的非常突然,導緻整個業務的開發上線時間非常短暫。在幾天内完成開發,上線,并且立刻接受大壓力的考驗,君知其難也。不得不承認,業務上線前的壓力測試結果并不盡人意。但是任務就在那裡,必須被完成。負責智慧社會作業系統的所有工程師都拿出了自己的看家本領,力保線上業務正常運作。
“鹹陽市外來人口登記業務”是一個前後端分離的業務系統。主要包含了前端頁面、背景服務、緩存、資料庫、短信業務5個服務元件。

1,通過Rainbond實作遠端協作
疫情的到來,迫使很多企業的員工必須在家遠端辦公,如何遠端協作才能在如此短暫的時間内完成業務的開發并上線,對于工程師們是一項艱巨的挑戰。
通過将開發——測試——上線全流程所需的資源全部部署于Rainbond,這樣,通過Rainbond提供的應用控制台,即可完成全流程遠端協作。這一切隻需要工程師們可以在家裡通過VPN通路到Rainbond應用控制台即可。
整個流程的簡要描述:
- 開發測試人員均可以通過vpn通路到Rainbond控制台。
- 開發人員向部署在Rainbond内部的Gitlab管理需求并遠端送出代碼。
- 通過代碼部署業務應用并上線。
- 測試人員通過部署在Rainbond内部的自動化測試工具對業務應用進行測試。
- 測試人員送出issue到Gitlab來回報BUG。
- 開發人員擷取回報,更新疊代代碼。
- 通過送出資訊中包含的關鍵字,觸發應用自動建構,自動将更新上線。
- 上線後如發現新的問題隐患,通過Rainbnond版本管理功能一鍵復原到上個穩定版本。
2,快速上線與復原
業務的開發沒辦法一蹴而就,任何一個業務都需要代碼的疊代更新,統計業務的開發人員通過基于Webhook實作的自動建構功能,将代碼快速部署到線上。
開發人員在送出代碼時,将指定的觸發關鍵字加入commit資訊,即可觸發Rainbond自動建構該服務元件。Rainbond将自動完成代碼拉取、建構、滾動更新上線的全流程。整個過程更加智能、更加自動化。
然而并非所有的代碼更新都是正向的,一旦發現代碼更新後線上業務出現了問題,那麼如何快速復原到上一個穩定版本,就變成了一個問題。在這次實戰中,統計業務的開發人員利用了Rainbond自帶的版本管理功能實作一鍵快速復原。
3,服務元件圖形化編排
當開發人員部署好所有的服務元件之後,如何讓它們彼此之間能夠通過依賴關系正常通信,互相調用呢?實戰中非常好的一個實踐是借助于Rainbond平台基于拓撲圖實作的圖形化服務元件編排。
抛棄以往複雜的配置方式,在web界面上簡單的拖拉拽即可實作服務元件的編排。對于開發人員而言,這樣的方式既感性又友善。
- 切換到應用拓撲圖界面。
- 點選“切換到編輯模式”。
- 從下遊服務元件的六角形拖拽一條線到上遊服務元件即可。
通過多次的拼裝,在簡單的服務元件之間就會形成複雜的拓撲,元件間彼此就可以互相調用,正常運作了。
應用實時性能監控和優化,支援5000+并發
想要在3天内完成整個鹹陽市130萬人資訊上報和管控服務,可以預見到這将會是一個高并發場景。這個場景,将對平台網關的抗并發能力、容器平台的承載能力、統計業務的處理能力、資料庫性能四個方面提出較高水準的需求。如何探測整條鍊路的瓶頸,并加以處理以提高綜合吞吐能力,就成了打赢這次“實戰”的關鍵點。
- 負載均衡降低網關壓力
- 支援業務執行個體自動故障遷移。
- 執行個體數量自動伸縮。
- 業務更新滾動更新不間斷。
- 服務元件間通信通過插件治理。
- 性能分析插件迅速發現業務瓶頸。
1,網關節點和計算節點伸縮
網關節點叢集的流量被全局負載均衡器所負載,這是業内處理并發最常用的手段之一。根據Nginx的輪詢算法,将流量均勻配置設定到所有網關節點,大大降低了單一網關節點的壓力。使其處理更高層的 Http 協定更加從容不迫。
Rainbond容器雲平台的計算節點,支援分布式部署。這樣的部署方式對于抗并發最大的意義在于:一旦某台計算節點由于壓力過大而崩潰,Rainbond健康檢測機制會在短時間内将故障節點上運作的業務容器執行個體進行自動遷移,始終保持業務正常運作。
2,通過應用市場快速複制應用,使用者分流
項目負責人早在業務上線前,就已經預料到大并發場景。是以在規劃開始階段,就将鹹陽市所有區縣進行分組,最終決定部署4套相同的業務來為不同的分組提供服務,這樣可以在業務處理能力這個層面進行人為的分流。大幅度降低單個統計業務系統的壓力。
在這裡,Rainbond内部市場功能發揮了作用,開發人員隻需要手動建構部署第一套業務系統,然後釋出到内部應用市場,即可快速複制出另外3個業務系統。而且一旦業務需要更新,隻需要将源業務系統更新後再次釋出,Rainbond内部市場提供的版本管理功能會自動識别更新,其它複制業務系統可以基于提示一鍵更新。
整個過程和以往人力部署的情況相比,人員的投入、操作的複雜程度、操作耗時都成倍的下降了。
3,應用根據使用者量彈性伸縮
Rainbond提供服務元件的伸縮功能,隻需要一鍵,就可以為目前服務元件快速伸縮出多個執行個體,并且自動提供負載均衡。這将大幅度降低單個執行個體處理業務的壓力。
在“鹹陽市外來人口登記業務”的所有元件中,我們為前端頁面、背景服務這兩個服務元件都伸縮了最多5個執行個體,這兩個服務元件也是經常進行實時更新的元件,基于多個執行個體,Rainbond提供滾動更新的功能,使業務的更新不會影響到線上的業務運作。
上圖中,顯示的就是一次建構完成後的滾動更新過程。
為了能夠讓業務流量過大時,可以自動擴充執行個體數量,我們還設定了基于記憶體使用率來觸發的自動伸縮功能。在運維層面更加自動化。
4,專門針對資料庫進行優化
在如同“鹹陽市外來人口登記業務”這樣一個業務系統中,資料庫的吞吐能力直接影響整個業務系統的綜合吞吐能力。在這個層面,我們做了這樣幾件事情來提高資料庫性能:
- Mysql本身的性能優化:添加 max_connections 參數,提供Mysql所能提供的最大連接配接數。
- 為背景服務安裝出口網絡治理插件,設定TCP最大連接配接數,從ServiceMesh微服務治理的層面,提高了背景服務到Mysql資料庫之間依賴關系的通信能力。需要注意的一點,是該插件預設記憶體設定太小,我們需要點選更新記憶體來提高設定。
- 提高Mysql讀寫磁盤的能力:Rainbond應用市場預設提供的Mysql應用,均使用了共享存儲類型的持久化存儲來挂載Mysql資料目錄。在這裡,我們将其更改為本地存儲類型。這樣做的目的在于使用主控端節點的本地磁盤代替Rainbond系統使用的共享存儲,犧牲Mysql故障遷移的能力來換取性能的大幅度提升。這樣的交易是否合理,取決于我們的資料庫是否已經由于磁盤IO性能而達到了瓶頸。
5,通過實時性能分析插件,監控和優化應用
為了更好的監控“鹹陽市外來人口登記業務”各個服務元件的壓力情況,我們為前端頁面、背景服務、資料庫分别安裝了Rainbond自帶的服務實時性能分析插件。業務運作期間,這個插件為我們帶來很多的有用資訊,多次幫助開發人員發現業務系統的不足之處,使開發人員可以在業務雪崩當機之前修正代碼并上線。
對于前端頁面、背景服務這樣的基于Http協定提供服務的元件,插件将提供平均響應時間、吞吐率、線上人數三項實時資料,以及最近5分鐘耗時URL排行、曆史資料等持續性資料。
- 通過分析排行中請求所有資源或接口的平均時間, 可以很友善的分析出目前業務系統的瓶頸在哪裡,并據此調優代碼。
- 根據曆史資料,我們發現目前元件在24小時内響應時間一直正常,線上人數峰值1600人同時線上,吞吐率根據人類作息時間正常起伏波動。
而對于Mysql資料庫而言,服務實時性能分析插件提供的資訊最大不同,在于最近5分鐘排行将替代為Mysql資料查詢、更新等操作的排行。
- 一次真實的經曆是,一段時間内Mysql的平均響應時間不斷在上升,背景服務處理能力随之急劇下降。危機邊緣,開發人員立刻分析5分鐘耗時排行,發現耗時排在第一位的查詢語句引用了臨時表,是一個慢查詢語句,并且已經在Mysql内産生了堆積阻塞查詢的現象。發現這個現象後立刻采取行動建立了索引,Mysql的響應時間緩慢的情況随之緩解。
6, 其它優化
除了上述這些優化, 我們還做了其它許多事情來提高系統的抗并發能力。
- 優化代碼參數,很多開發架構天生帶有最大連接配接數管理機制,例如對于Spring Boot項目而言,就需要調節
server.tomcat.max-connections
server.tomcat.max-threads
- 優化短信驗證業務流程,在大并發情況下,業務系統請求外部資源(例如短信業務)時,也需要考量該外部業務本身的并發限制。盡量以異步任務的方式處理,不要陷入外部資源一旦請求超限,不再響應導緻了自身業務流程受阻,最後阻塞了業務的運作。
- 關注出口網絡治理插件與服務實時性能分析插件的記憶體設定,避免記憶體過小導緻插件OOM,并随之影響業務服務元件的運作。
- 關注業務服務元件執行個體記憶體占用,避免記憶體配置設定過小導緻的OOM。
總結
現在 鹹陽市疫情填報應用 已經度過了流量高峰期。整個填報期間,4套業務系統平均線上人數保持在4000人以上,峰值達到5000+。智慧社會作業系統沒有出現一次當機情況,始終穩定承載填報應用正常運作。後續,智慧社會作業系統将繼續承載“重點人員監控系統”、“疫情可視化”等其他疫情管控系統,持續為鹹陽市抗擊“新冠”疫情作出自己的貢獻。