本文總結面對高併發場景可以採用的解決方案,文章只是介紹整體相關概念,其中每一項都可以利用多種不同中間件或者框架來實現,可以根據需要選擇某幾個進行更加深入的學習和理解。
1. 擴容
- 垂直擴容(縱向擴展):提高系統部件能力
- 水平擴容(橫向擴展):增加更多系統成員來實現
(1) 數據庫擴容:
- 讀多寫少--讀操作擴展:使用memcache、redis、CDN等緩存
- 讀少寫多--寫操作擴展:使用Cassandra、Hbase等
2. 緩存
(1) 緩存特徵概念:
- 命中率:命中數/(命中數+沒有命中數)
- 最大元素(空間)
- 清空策略:FIFO、LFU、LRU、過期時間、隨機等
(2) 緩存命中率影響因素:
- 業務場景和業務需求
- 緩存的設計(粒度和策略)
- 緩存容量和基礎設施
(3) 緩存分類和應用場景:
- 本地緩存:編程實現(成員變量、局部變量、靜態變量)、Guava Cache
- 分佈式緩存:Memcache、Redis
(4) 高併發場景下緩存常見問題:
- 緩存一致性
- 緩存併發問題
- 緩存穿透問題
- 緩存的雪崩現象
3. 消息隊列
(1) 消息隊列特性
- 業務無關:只做消息分發
- FIFO:先投遞先到達
- 容災:節點的動態增刪和消息的持久化
- 性能:吞吐量提升,系統內部通信效率提高
(2) 消息隊列使用原因:生產和消費的速度或穩定性等因素不一致
(3) 消息隊列好處:
- 業務解耦
- 最終一致性
- 廣播
- 錯峯與流控
4. 應用拆分
(1) 應用拆分的原則
- 業務優先
- 循序漸進
- 兼顧技術:重構、分層
- 可靠測試
(2) 應用拆分時的思考
- 應用之間通信機制:RPC(dubbo等)、消息隊列
- 應用之間數據庫設計:每個應用都有獨立的數據庫
- 避免事務操作跨應用
5. 應用限流
(1) 應用限流的算法
- 計數器法
- 華東窗口
- 漏桶算法
- 令牌桶算法
6. 服務降級和服務熔斷
(1) 服務降級的分類
- 自動降級:超時、失敗次數、故障、限流
- 人工降級:秒殺、雙11大促等
(2) 服務降級與服務熔斷的比較
- 共性:目的、最終表現、粒度、自治
- 區別:觸發原因、管理目標層次、實現方式
(3) 服務降級要考慮的問題
- 核心服務、非核心服務
- 是否支持降級,降級策略
- 業務放通場景,策略
7. 數據庫切庫分庫分表
8. 高可用手段
- 分佈式任務調度:elastic+zookeeper,schedulerx
- 服務器主備切換:apache curator+zookeeper分佈式鎖實現
- 監控報警機制
- 阿里的中間件:tddl,diamond,精衛,txc,opensearch等