「
Hi !我是小小,今天是本周的第六篇,本月的最後一篇,你還好嗎?我是小小,我們本周的內容是大話高並發架構
前言
高並發經常會發生在有大量用戶量,用戶高聚集的業務場景,例如秒殺活動,定時領取紅包。為了讓業務可以在高並發的時候能夠相當好的運行,並給用戶一個良好的交互體驗,所以,考慮各種高並發的場景,設計高並發架構。
伺服器架構
業務從初期到成熟,從單一到集群,最後到分布式,需要有伺服器的負載均衡,數據的主從複製,nosql的各種集群,靜態文件上傳cdn等等。需要用到的伺服器架構如下
伺服器
負載均衡,如阿里雲的slb 或者是nginx資源監控分布式
資料庫
主從分離,集群DBA表優化,索引優化分布式
nosql
redis:主從分離,集群mongodb:主從分離,集群memcache:主從分離,集群
cdn
htmlcssjsimage
並發測試
對於高並發業務,需要進行高並發的業務測試,通過大量的數據分析評估整個架構支撐的並發量。測試並發使用的工具如下阿里雲性能測試jmettervisual studio 性能負載測試Microsoft Web Application Stress Tool
實現方案
通用方案
日用戶流量大,但是比較分散,偶爾會有用戶聚合的情況
場景
用戶籤到,用戶中心,用戶訂單
伺服器架構
說明
這些場景,基本都是用戶進入app後會操作,這些用戶不會高聚集,同時這些表又是大的數據表,業務很多,所以需要減少DB的查詢,優先查詢緩存,如果緩存不存在,再命中DB。所以需要使用緩存,為了降低緩存,所以使用分布式的緩存,對DB實現hash分組,把用戶分布到不同的緩存中,不會影響查詢效率。
方案
用戶籤到
計算用戶分布的key,redis hash中查找用戶今日籤到的消息
能查詢到,返回查詢的信息
如果沒有查詢到,DB查詢今日是否搶到過,如果搶到過,信息同步redis
如果db也沒有查詢到,進行籤到邏輯,db添加今日籤到記錄。這是一個事物
緩存籤到信息到redis,返回籤到信息
用戶訂單
這裡只緩存第一頁訂單信息
用戶訪問訂單列表,如果是第一頁讀緩存,如果不是讀DB
計算出用戶分布的key,redis hash中查找用戶訂單信息
如果能查詢到用戶訂單信息,返回訂單信息
如果不存在用戶信息,就直接db查詢第一頁 訂單數據,然後緩存redis,返回訂單信息
用戶中心
計算用戶key,redis hash 中查找出用戶訂單信息
能查找到,返回用戶信息
如果未找到,緩存redis,返回用戶信息
「
以上的僅僅是一個相對於比較簡單的並發架構
消息隊列
「
用於緩存秒殺,活動,用戶在一瞬間湧入產生的高並發的請求
場景:
定時領取紅包。
架構
說明
場景中的定時領取是一個高並發的業務,秒殺活動會在一瞬間湧入。這種業務會直接命中DB,會導致數據的崩潰。設計這種業務的時候,需要使用消息隊列,可以把參與的用戶信息添加到消息隊列中,然後緩慢的消耗。
方案
定時領取紅包:使用redis的list當用戶參與活動,用戶信息push到隊列中書寫多個線程去pop數據,進行發放紅包的業務。
一級緩存
一級緩存就是使用站點伺服器去緩存數據,只緩存部分請求量大的數據,並且數據量還需要控制,一級緩存需要設置秒為單位的過期時間,具體業務場景看業務場景而定,目的是有高並發的時候可以讓數據獲取命中到一級緩存,減少nosql的壓力。
架構圖
場景
APP首屏的數據接口
靜態化數據
對於更新不頻繁,並且數據允許短時間內的延遲,可以通過數據靜態化成json,xml,html等數據文件上傳cdn,然後拉取數據的時候優先拉取cdn,然後再緩存,最後資料庫,用於減輕db的壓力。
分層,分割,分布式
大型網站需要很好的支撐高並發,這需要很長的規劃設計,主要需要如下
分層:系統在橫向維度切分成幾個部分,每個部門負責一部分相對簡單並且單一的職責,然後通過上層,對下層的完整依賴形成一個完整的系統。例如把一個電商分為,應用層,服務層,數據層。應用層:網站首頁,用戶中心服務層:訂單服務,用戶管理服務數據層:關係型資料庫,nosql資料庫。
分割在縱向對業務進行切分例如,用戶中心可以分割成為帳戶信息模塊,訂單模塊,充值模塊,提現模塊,優惠券模塊
分布式分布式應用和服務,把應用進行分布式部署。當業務達到一定用戶量的時候,需要對伺服器進行負載均衡,資料庫,緩存主從集群分布式靜態資源,靜態資源上傳cdn分布式計算,使用hadoop進行大數據分布式計算
集群
對於用戶訪問集中的伺服器,搭建集群,通過負載均衡共同對外提供服務,當有更多的用戶訪問的時候,只需要加機器即可。
ngixn反向代理slb資料庫的主從分離
異步
在高並發業務場景中,如果涉及到資料庫操作,主要壓力是在資料庫伺服器上,當連接數量達到最大值的時候,有其他連接資料庫的請求操作的時候,就需要有空閒的連接。
場景
自動彈窗籤到雙十一搶紅包雙十一訂單入庫
設計
使用消息隊列,把入庫的內容放入到消息隊列中,業務接口直接返回提示,高峰期延遲到帳。然後再寫獨立程序從消息隊列中,讀取進行入庫操作,入庫成功以後刷新緩存,如果入庫失敗,記錄日誌,方便查詢反饋和重新持久化。
補充
其他場景,例如簡訊發送
面向服務
soa 面向服務架構設計微服務更加細膩度的服務化。
例子
用戶行為跟蹤記錄統計
說明
通過上報應用模塊,操作事件,事件對象,等數據,記錄用戶操作行為。例如用戶在某個商品模塊點擊了某一件商品,或者看了某一件商品。
架構
node.js web 應用負載均衡redis主從集群mysql主從複製nodejs + express + ejs + redis + mysql
冗餘自動化
當高並發業務出現單擊的時候,需要快速的有備用的替代,所以需要自動化執行這些操作
冗餘
資料庫備份備份伺服器
自動化
自動化監控自動化報警自動化降級
關於作者
我是小小,一枚生於二線,活在一線城市的程序猿,我是小小,我們下期再見。
小明菜市場