遵循一套用於安全開發和發佈的準則,爲開發活動編織一張質量安全網,儘量下降出問題的機率。安全
影響面評估準則
確保代碼安全的第一準則是:代碼的影響面評估。在覈心流程裏的一行代碼的影響面,勝於在非核心流程裏的百行代碼的影響面。
新手工程師,每每容易見樹不見林,着眼於眼前的功能,而未察覺對現有或全局的負面影響。併發
- 在覈心流程或通用方法里加代碼時,要謹慎。哪怕是一行,均可能會出問題。
- 儘可能避免修改原有方法的簽名。使用重載方法或拷貝方法來解決。若是原有方法只有一個調用方,能夠這麼作,但要回歸影響的功能;若是有兩個調用方,謹慎這麼作;若是有三個調用方,避免這麼作【由於迴歸量可能很大,超出所能預料】。
- 實現眼前的功能時,要同時關注會被影響的功能。
- 修改的方法有不少調用方時,要考慮兼容,評估每一個被影響到的方法及風險。
- 新增而不修改原有代碼,一般不會出問題。努力作到開閉原則:「對修改關閉,對擴展開放」。
- 新增配置而不修改原有配置,一般不會出問題。可是「老配置+新應用」會致使問題。
- 當用新作法替換原有作法時,尤爲要回歸全部影響到的點。
- 對可能產生風險的代碼敏感。
- 勿存僥倖心理;勿對代碼過於自信。
健壯性準則
不少線上問題出在代碼的不健壯性上。即便引起的是小問題,未致使故障,但修復時也要從新測試和發佈,耗時耗力。工具
- 在覈心流程裏解析不可靠的數據(尤爲是 JSON 數據)時,加 try-catch 。
- 在總體流程中流經的肯定極可能會拋出異常的代碼,若是不指望影響總體的執行完成,加 try-catch 。
- 在總體流程中流經的不肯定是否有場景會致使拋出異常的代碼,加 try-catch。
- 避免鏈式地獲取嵌套對象的屬性,很容易致使 NPE 。
- 對 API 返回結果判空。
- 對不太肯定是否爲空的對象或容器判空。
- 考慮對原有狀況的兼容。
不可變準則
修改入參,使用全局變量,每每使得程序行爲更難推測,錯誤潛藏很是隱祕,出問題後排查也會很是耗時。測試
- 避免修改方法入參(對象或容器)。
- 使用 stream.filter 替代刪除列表中的元素。
- 當須要修改入參來實現時,老是考慮經過返回對象來替代。
- 提供 merge 操做優化修改入參。
- 避免使用全局變量。
快速失敗準則
快速失敗是避免產生大量髒數據的法寶之一。優化
- 若是一項功能須要多個前置條件同時具有才能正確運行,錯誤運行會致使不可肯定的結果時,在任一條件不具有時,及時拋出異常終止。
重大重構準則
- 儘量新增接口/鏈路而非修改原來的。
- 使用策略模式分離新鏈路和舊鏈路。
- 增長開關,可以快速切回原來的服務。
- 確保可快速回滾【應用及配置】。
- 經過逐步分流來切入新流量,冷卻老流量。
- 用次要的影響面小的業務進行線上試點。
併發安全準則
- 單例組件類儘量只引用不含有實例成員的單例組件。
- 組件類避免含有可變的實例成員;這種設計容易潛藏難以覺察的併發風險。
- 若是組件類含有可變的實例成員,則要麼確保不在併發環境使用,要麼添加組件的原型聲明。
- 生產環境裏使用全局配置良好的線程池,而不是簡陋配置的線程池。
- 避免在方法裏動態建立線程池。除非這是一個小流量應用,且方法調用不多。
大流量準則
- 應對流量大的長耗時任務,限制指定時間段的處理數量。
- 應對流量大的工具須要加限速能力;限速可動態調整。
- 降級非核心服務和數據,可配置。
- 數據存儲冗餘或優化,減小爲了取少許次要數據而致使的外部服務調用。
- 實時性要求不高的場景,採用延時隊列或非實時接口來處理。
關鍵日誌準則
- 核心鏈路和關鍵數據必須打日誌;方便排查問題。
- 已預估的出錯或致命問題的打錯誤日誌;發佈時要尤爲關注此類日誌。
- 不影響系統運行的錯誤打警告日誌;避免干擾發佈是否OK的判斷。
提早預知準則
- 對於預發上報出的任何問題保持敏感。由於那多是老天爺在提醒你。
- 對於返回大量數據的查詢服務類,可使用對比引擎來比較線上和預發的返回結果。
嚴格測試準則
- 單測所有經過;不可繞開原有單測。
- 不管改動大小,均要自測。
- QA 和預發測試,自測經過。
- 已有測試用例所有經過。
安全發佈準則
- 一個項目涉及多個應用和配置時【應用+配置 > 3 時】,必定要制定發佈文檔,指明配置與應用的發佈順序,以及不遵循該發佈順序時會致使的風險。
- 發佈文檔的細節必須很是具體明確,每個操做和命令都毫無歧義。即便換另外一我的來發布,只要按步驟執行,就不會出問題。
- 發佈 4 個以上應用時,應找團隊其餘小夥伴協助,減小因發佈壓力過大可能致使的誤操做或長耗時。
- 發佈多個應用時,在代碼實現考慮兼容,確保部分能夠提早發佈或者並行發佈。
- 發佈時要專一,不容許被打斷;發佈後一小時內應持續觀察,儘可能不要離開。
- 節前非重要緊急問題避免發佈;與產品同窗協商好,改日發佈。
- 因爲配置切換致使線上容易產生大量髒數據,或者須要修復不少數據時,最好凌晨發佈。 儘可能一次性解決,而不要累積起來屢次解決【撈數據和修復數據的成本有時很大】。
- 涉及不少配置和 DDL 的大項目發佈,最好凌晨發佈。有充足的時間測試迴歸。
- 開發與發佈前,確保 QA 和預發、線上的配置是一致的。配置不一致,可能會致使 QA 和預發的測試OK,可是到線上就會出問題。
- 使用灰度發佈或藍綠髮布;白名單驗證;分流發佈;分批發布;