可用性之服務隔離
服務隔離的目的
在系統發生故障時限制其影響範圍
隔離在保障整個服務的可用性上具有重要作用
隔離維度
執行緒級別的隔離:不同的任務給不同的執行緒執行
程式級別的隔離:將系統業務拆分成多個微服務,部署到不同的機器上
程式間的通訊方式:不同機器經過遠端呼叫,相同機器透過記憶體,管道(記憶體中的一種特殊的檔案),訊息來通訊
快慢隔離:避免佇列阻塞。影片稽核優先處理小影片;error日誌和非error日誌分開採集
熱點隔離:有靜態和動態熱點資料。實現動態發現熱點的功能。提前預熱快取;隔離,使用單獨的服務來處理
業務核心程度隔離:按照服務的核心程度,將服務分級。重要程度高的服務單獨部署,並提供冗餘資源提高容災能力
動靜分離之表設計:影片基本資訊和播放量等頻繁變更的資料分離
動靜分離之CDN:靜態資源透過CDN加速
可用性之服務限流
在一段時間內,可以處理多少個請求。應對突發流量,防止某個使用者將系統資源耗盡影響其他使用者使用。控制成本,在有限資源下能穩定提供服務
在哪些地方要限流:請求入口處,使用nginx的配置限流 。業務服務入口處,api閘道器等中介軟體
分散式限流
令牌桶和漏桶只能針對單個節點,分散式限流是整個應用全域性的流量。分散式限流一般用Redis實現
如何確定流量的閾值:全鏈路壓測。使用訊息中介軟體儲存請求資料,然後在壓測平臺回放流量
基於響應時間的動態限流:首先我們記錄每次呼叫後端請求的響應時間,然後在一個時間區間內(比如5秒)計算這段時間的P90或P99,如果P90或P99大於我們設定的閾值我們就自動限流
基於系統資源的動態限流:透過系統資源使用率動態限流,統計一段時間的系統資源(CPU、記憶體)達到某個百分點就限流
可用性之服務降級
透過降低迴復呼叫方的質量來減少系統的工作量。例如推薦系統出問題,直接返回預設的預設商品展示。雙十一暫時關閉一些功能也是降級的一種
透過熔斷避免服務雪崩:區域性故障引發全域性故障就是雪崩。核心服務呼叫的其他服務資源不足導致核心服務被阻塞,這種情況可以透過熔斷降級來解決。失敗達到指定次數,服務開啟熔斷,關閉達到指定時間,服務半開,成功達到指定次數,服務全開
哪些情況需要降級:依賴服務不可用,響應時間過長
降級的實現方式:對服務定級,讓非核心服務先降級。降低返回結果的精確度。請求短路,不走DB,返回快取。簡化流程,放棄部分操作。延遲執行