所謂的降級設計(degradation),本質是為了解決資源不足和訪問量過大的問題。當資源和訪問量出現矛盾的時候,在有限的資源下,為了能夠扛住大量的請求,需要對系統進行降級操作。暫時犧牲掉一些東西,以保障整個系統的平穩執行。
犧牲哪些東西:
降級之後,只能保證流程最終結果的一致性。會有兩種做法,一種是簡化流程的一致性,一種是降低資料的一致性。
舉個例子,電商的下單交易系統,在強一致的情況下,需要結算賬單,扣除庫存,扣除賬戶上的餘額(或發起支付),最後進行發貨流程,這一系列的操作。
在系統降級時,可以把這一系列的操作做成非同步的。庫存從單筆強一致性也變成了多筆最終一致性,如果庫存不夠了,就只能根據先來後到取消訂單了。而支付也從最開始的下單請求時的強一致性,變成了使用者到付的最終一致性。
降低資料的一致性一般來說會使用快取的方式,或是直接就去掉資料。
參看 快取更新的套路
最好不要停止次要的功能,首先可以限制次要的功能的流量,或是把次要的功能退化成簡單的功能,最後如果量太大了,才會進入停止功能的狀態。(首先考慮的是限流,或者退化為簡單功能,而不是直接就停止)
降級之後,必要的時候忽略非關鍵資料並只返回重要的資料。
對業務做非常仔細的梳理和分析
清楚地定義好降級的關鍵條件
比如,吞吐量過大、響應時間過慢、失敗次數多過,有網路或是服務故障,等等,然後做好相應的應急預案。這些預案最好是自動化或半自動化執行的。
簡化業務流程
梳理業務的功能哪些是必須要死保的功能,哪些是可以犧牲的功能。設計好可以簡化的或是用來應急的業務流程。當系統出問題的時候,就需要走簡化應急流程。
流水賬記錄
降級的時候,需要犧牲掉一致性,或是一些業務流程,在使用快取和非同步呼叫實現降級時,同時需要以流水賬的方式記錄下來,這樣方便對賬,以免漏掉或是和正常的流程混淆。
降級的功能的開關可配
在要降級的時候推送相應的配置,或者在對外服務的 api 上有所區分由上游呼叫者來驅動。
資料方面的降級,需要前端程式的配合
前端的程式可以根據後端傳來的資料來決定展示哪些介面模組,將由降級未提供的資料展示介面去掉
降級演練
降級的功能平時不會總是會發生,屬於應急的情況,所以,降級的這些業務流程和功能有可能長期不用而出現 bug 或問題,對此,需要在平時做一些演練。
分布式系統學習 16 彈力設計篇 限流設計
限流,是對併發訪問進行限速,保護系統不會在過載的情況下出現問題 一般來說,觸發的限流行為如下 一般的做法,是當流量暴增的時候,將同一時間內發起請求數最多的客戶端請求全部丟棄。這種方法可以抵擋住惡意發起的高併發請求。關閉或是把後端服務做降級處理,騰出資源處理更多的請求。降級的方式有 一般會使用乙個佇列...
分布式系統學習
分布式系統中節點分布情況在空間上是隨意分布的。系統中所有節點都是對等的,沒有主從之分。副本是分布式系統對資料和服務提供的一種冗餘方式,資料副本是指在不同節點上持久化同乙份資料,解決單點故障資料丟失的問題,服務副本是指多個節點提供同樣的服務,每個節點都有能力接受來自外部的請求並進行相應的處理。分布式系...
作業系統學習 分布式系統結構
分布式系統是一組不共享記憶體和時鐘的處理器的集合,即每個處理器都有它自己的記憶體,處理器之間的通訊可通過各種通訊網路加以實現。一 動機 建立分布式系統主要由4個方面的原因 1 資源共享 2 加快計算速度 3 可靠性 4 通訊 不同站點可以有機會交換資訊 二 分布式作業系統的型別 1 網路作業系統 通...