架構師日記-軟體高可用實踐那些事兒
作者:京東零售 劉慧卿
一 前言
關於軟體的高可用,是一個老生常談的話題。“高可用性”(High Availability)通常來描述一個系統經過專門的設計,從而減少停工時間,而保持其服務的高度可用性。其計算公式是:可用率=(總時間-不可用時間)/總時間。
本文重點從落地實踐的視角作為切入點,帶領大家從協作效率,技術落地和運營規範幾個方面來展現高可用的實施步驟和落地細節。為了方便理解,先來統一語言話術,看一下軟體交付過程中的各個階段,如下圖:
為什麼說軟體的高可用會面臨著諸多挑戰呢?
總結一下,我們具體面臨的問題如下:
二 協作效率保障
認知誤區
從整個需求交付鏈路我們可以發現,隨著鏈路的逐級遞增,資訊的傳遞鏈路分支就會越多,傳遞層級就會越深。這會導致兩個問題:
這兩個問題最終導致的結果,就是協作效率的降低。
一個沒有實戰經驗的同學往往會認為增加人數,就會提高需求交付效率。其實這種想法不完全正確,具體關係參考下圖:
這就像蓋樓房,如果一個人按部就班的建設,需要100天完成。如果請了100個人來幫忙,能否用1天的時間完成房子建設呢?答案是否定的。
這裡面有協作的成本,比如:團隊默契(設計師,瓦工,泥工,水電工),崗位匹配,風險控制;
這裡面有流程的依賴,比如:施工依賴於設計,軟裝總在硬裝之後;
這裡面有成本預算,比如:整個組織的人才梯度,規模大小(承建方,代理商,承包商);
以上這些,都不是簡單的通過人力鋪設來解決的。
流程規範
提高協作效率的底層邏輯是通過減少交付鏈路層級,縮簡訊息傳遞鏈路,進而保證資訊的準確性和傳遞效率。(組織建設層面的內容這裡不做展開)
這就要求具有今日事,今日畢的行動力。組織層面這叫流程規範,個人層面這叫做事方法,責任心。
儘量避免將當下的事情拖延到下一個環節,否則就會影響後續鏈路的排期計劃和交付效率,極端情況甚至會出現返工的情形。簡言之,考慮清楚,不埋坑。產品需求對研發,研發設計對測試,測試用例對產品等各個交付節點都是如此,交付物一定是靠譜的。
三 技術落地保障
在需求響應週期中,高質量的落實架構設計,編碼實現,安全上線,部署運營等生產階段,是軟體高可用落地保障的前提和基礎。
架構設計
架構設計往往影響著系統的前期實現成本(即ROI)和後續運維難度,屬於軟體的頂層設計,這裡面既包含巨集觀的設計方案,也包含落地細節裡的正規化約束。
邀請架構師參與:核心交易節點、重大需求改動邀請架構師參與,這是閉坑最直接有效的方式;
重視設計文件:方案描述清楚了,並取得相關利益者的認可,是走在正確道路上的前提。
容災設計:要預留後路,提前想清楚,做好容災設計。可回滾,可熔斷,可重試,可降級。
魯棒性設計:無狀態設計,防重設計,冪等設計,資料一致性設計
編碼實現
如果說架構設計是骨架,那麼編碼實現就是神經,血管和肌肉。前者決定了能走多穩,走多久,後者決定著走多快,走多遠。落實到編碼層面,就是程式碼的衰老腐敗程度。
程式碼評審機制:程式碼評審不僅僅是發現系統中存在的問題這麼簡單。它是一種長期行為,是進行組織文化貫徹和傳承的一種形式和載體。評審的過程中,明確了業務職責邊界,設計與編碼共識,優秀的標準導向等研發共識。相當於通過具象化的案例,給出針對性的指導,這些都是保證團隊戰鬥力的基石。
研發過程中的很多問題,通過程式碼評審機制可以被發現和解決,比如:
安全上線
線上70%的故障都是由某種變更而觸發的,其中相當一部分佔比是不規範的上線引起的。所以安全上線這一環節至關重要。
部署運營
實現高可用的一個很重要的手段就是能力冗餘。下面給出方向和思路,具體落地細節和策略,可以根據具體情況各自延展。
四 運營規範保障
運營規範
應急預案
高可用意味著對故障時間的容忍性差,意味著沒有時間進行故障排查和修復,更沒有時間開啟程式碼進行漏洞排查。這就要求我們有一套完備的應急預案,這套預案能夠解決大部分可預見的故障問題。
詳細事故應急處理手冊,可以參照下圖:
規範達標
再好的流程和規範都需要有對應的機制來貫徹執行,否則就是鏡中花,水中月,看著美好,實則沒用。可執行,能度量,是按照目標變好的前提。所以這裡給出一個《高可用達標定期自查表》的工具,輔助規範落地。
五 總結
本文從“高可用為什麼存在著很大挑戰?”的問題展開探討,強調了需求交付過程中,協作效率的重要性,並指出了為什麼要遵從“今日事,今日畢”的工作原則。又從架構設計,編碼實現,安全上線,部署運營等幾個方面,詳細介紹了技術落地保障相關的指導規範和落地細節。最後又從上線後運營的角度,給出了應急預案三板斧,規範達標定期自查表等比較實用的運營保障工具。希望能夠給讀者帶來幫助。
- 應用健康度隱患刨析解決系列之資料庫時區設定
- 對於Vue3和Ts的心得和思考
- 一文詳解擴散模型:DDPM
- zookeeper的Leader選舉原始碼解析
- 一文帶你搞懂如何優化慢SQL
- 京東金融Android瘦身探索與實踐
- 微前端框架single-spa子應用載入解析
- cookie時效無限延長方案
- 聊聊前端效能指標那些事兒
- Spring竟然可以建立“重複”名稱的bean?—一次專案中存在多個bean名稱重複問題的排查
- 京東金融Android瘦身探索與實踐
- Spring原始碼核心剖析
- 深入淺出RPC服務 | 不同層的網路協議
- 安全測試之探索windows遊戲掃雷
- 關於資料庫分庫分表的一點想法
- 對於Vue3和Ts的心得和思考
- Bitmap、RoaringBitmap原理分析
- 京東小程式CI工具實踐
- 測試用例設計指南
- 當你對 redis 說你中意的女孩是 Mia