如何應(yīng)對大數(shù)據(jù)高并發(fā)
- 增強服務(wù)器硬件配置
- 增加cpu核心, 高速緩存, 頻率
- 增加內(nèi)存容量, 頻率
- HDD換成SSD
- 使用磁盤陣列
- 使用高速網(wǎng)卡
- 將雙絞線換成光纖,甚至是背板
- 使用專線
- 分流(主要指負載均衡)
- DNS
- CDN
- F5
- LVS
- LBF
- HAProxy
- Nginx
- 文件服務(wù)器
- 動靜分離
- 數(shù)據(jù)庫讀寫分離
- 數(shù)據(jù)冷熱分離
- 服務(wù)拆分
- 分布式/微服務(wù): 細粒度的服務(wù)拆分,方便按需進行伸縮
- 數(shù)據(jù)庫: 分庫,分表
- 前后端采用不同域名
- 服務(wù)治理(故障轉(zhuǎn)移和服務(wù)伸縮)
- 服務(wù)注冊: zookeeper, etcd, consul
- 服務(wù)發(fā)現(xiàn): ocelot
- 心跳檢測
- 服務(wù)質(zhì)量
- 限流
- 熔斷
- 降級
- 提前一切可提前的
- 緩存預(yù)熱
- 異步刷新緩存(使用MQ或定時任務(wù), 即事件調(diào)度和定時調(diào)度)
- 站點預(yù)熱: 動態(tài)內(nèi)容靜態(tài)化
- 延遲一切可延遲的
- 使用MQ將一些不是那么重要的或無需同步執(zhí)行完畢的計算任務(wù),延遲執(zhí)行
- 性能優(yōu)化
- 批量讀寫
- 順序讀寫
- 減少網(wǎng)絡(luò)IO
- 減少磁盤IO
- IO多路復(fù)用
- 按需讀寫
- 盡可能的將數(shù)據(jù)和計算資源放在較近的位置
- 優(yōu)化數(shù)據(jù)庫索引,規(guī)范查詢,必要時,可適當調(diào)整業(yè)務(wù)
- 盡可能快速的釋放不再需要的資源
- 減少資源競爭
- 服務(wù)擴容
- 服務(wù)集群化
- RDB集群化
- NoSQL集群化
- 服務(wù)無狀態(tài)化
- 使用K8S對服務(wù)進行動態(tài)伸縮
案例總結(jié):
我們以秒殺場景為例, 當大量用戶請求進來時, 一個服務(wù)是扛不住的, 這時候我們想到的是分流, 就像現(xiàn)在打疫苗一樣, 不同地區(qū)的人, 就近打疫苗, 如果全部去大醫(yī)院, 或全部去北京打, 這個肯定是扛不住的; 當請求到達服務(wù), 如果此時服務(wù)才開始準備數(shù)據(jù), 勢必會照成請求的擁塞, 所以我們需要提前將動態(tài)內(nèi)容靜態(tài)化, 就像我們打疫苗時, 是提前生產(chǎn)好的, 而不是打的時候再生產(chǎn), 這樣就可以加快速度; 為了提高并發(fā), 我們一般取數(shù)據(jù)時, 比如庫存, 不去數(shù)據(jù)庫取, 而是從redis緩存取, 就像打疫苗時, 我們的疫苗是提前分發(fā)到疫苗服務(wù)網(wǎng)點, 然后直接在打疫苗的服務(wù)網(wǎng)點拿, 而不是去廠家或倉庫拿一樣; 當緩存中沒有數(shù)據(jù)時, 我們會去數(shù)據(jù)庫中取, 但是一個數(shù)據(jù)庫可能存不下或無法提供非常高的查詢請求, 此時我們就會去做數(shù)據(jù)的垂直拆分和水平拆分, 以提供更高的存儲容量, 做讀寫分離, 以提高查詢的并發(fā), 就像疫苗多個廠家生產(chǎn), 多倉庫儲存一樣; 我們將生成訂單和發(fā)送通知, 先生成一個消息發(fā)往MQ, 然后由其它服務(wù)處理一樣, 就像我們打完第一針, 給個憑證(即消息), 等過個21天再來打第二針(即消費消息), 將無需同步執(zhí)行的任務(wù), 延時執(zhí)行; 最后將訂單信息落庫, 將用戶帶到支付頁面, 就像我們打完第二針, 會發(fā)另外一個憑證, 方便出行一樣.