秒殺系統(tǒng)架構(gòu)原則 “四要一不要”
秒殺系統(tǒng)的本質(zhì)是滿足高并發(fā)建芙、高性能和高可用的分布式系統(tǒng)奋单。秒殺系統(tǒng)的架構(gòu)原則總結(jié)為四要一不要闻察。
數(shù)據(jù)盡量少
數(shù)據(jù)量盡量少的原則是指上傳給服務(wù)器和返回給用戶的數(shù)據(jù)要足夠小捆探,因?yàn)椴还苷?qǐng)求數(shù)據(jù)還是返回?cái)?shù)據(jù)都需要網(wǎng)絡(luò)傳輸并且經(jīng)過服務(wù)器壓縮和字符編碼奔誓,這些操作都很消耗cpu斤吐。
數(shù)據(jù)盡量小要求依賴的數(shù)據(jù)盡可能小,包括完成邏輯需要讀取和存儲(chǔ)的數(shù)據(jù)厨喂。調(diào)用其他服務(wù)涉及數(shù)據(jù)的序列化和反序列化皱碘,其中數(shù)據(jù)庫也會(huì)成為瓶頸叮叹。
請(qǐng)求數(shù)盡量少
網(wǎng)頁元素資源的加載都需要socket請(qǐng)求獲取數(shù)據(jù)蠢涝,合并css切诀、JavaScript等能有效較少請(qǐng)求數(shù)。
路徑要盡量短
路徑是指從請(qǐng)求到返回給用戶中間經(jīng)歷的節(jié)點(diǎn)數(shù)斜纪,可以是一個(gè)系統(tǒng)或者一個(gè)新的socket請(qǐng)求贫母。每增加一個(gè)路徑都會(huì)增加不確定性文兑,減少路徑可以增加可用性、提升性能(減少序列化和反序列化)腺劣、減少延時(shí)(網(wǎng)絡(luò)數(shù)據(jù)傳輸)绿贞。
把多個(gè)遠(yuǎn)程過程調(diào)用rpc合并在一臺(tái)機(jī)器部署,將rpc調(diào)用編程jvm內(nèi)部系統(tǒng)調(diào)用誓酒。
依賴盡量少
依賴是指完成一次用戶請(qǐng)求必須依賴的服務(wù)或系統(tǒng)樟蠕。0級(jí)系統(tǒng)盡量減少對(duì)1級(jí)系統(tǒng)的依賴贮聂,防止重要系統(tǒng)被不重要系統(tǒng)拖垮靠柑。
不要有單點(diǎn)
分布式系統(tǒng)重要架構(gòu)原則就是 消除單點(diǎn)。避免單點(diǎn)的方法就是將服務(wù)無狀態(tài)化吓懈,把服務(wù)狀態(tài)和服務(wù)器解耦歼冰。
動(dòng)靜分離方案
數(shù)據(jù)的動(dòng)靜分離,總結(jié)起來就是提高單次請(qǐng)求效率耻警,減少?zèng)]必要的額請(qǐng)求隔嫡。動(dòng)靜數(shù)據(jù)區(qū)分是否含有于用戶相關(guān)的數(shù)據(jù)。
緩存靜態(tài)數(shù)據(jù)
- 緩存在離用戶最近的地方 常見的緩存方式是瀏覽器甘穿、CDN腮恩、服務(wù)器cache中。
- 緩存用戶http鏈接 靜態(tài)改造就是直接緩存用戶的http鏈接而不只是緩存數(shù)據(jù)温兼,例如web服務(wù)器根據(jù)用戶請(qǐng)求鏈接秸滴,直接從緩存中獲取http響應(yīng)信息返回給用戶。
- 在那層做緩存 例如使用web服務(wù)器(nginx募判、Apache)等直接緩存靜態(tài)文件荡含,可以屏蔽java層對(duì)大量鏈接的處理。
動(dòng)靜分離改造
- URL唯一化 可以將唯一化的URL作為key緩存
- 分離瀏覽者相關(guān)信息 瀏覽者相關(guān)的信息通過異步方式獲取
- 分離時(shí)間因素
- 異步地域化信息
- 去掉cookie 緩存中不應(yīng)該包含cookie等用戶相關(guān)信息
動(dòng)靜分離的方案
- 實(shí)體單機(jī)部署方案 單機(jī)部署沒有網(wǎng)絡(luò)瓶頸届垫,提升命中率減少gzip壓縮
- 統(tǒng)一cache層 單獨(dú)抽離cache層释液,便于維護(hù)管理和監(jiān)控。cache層內(nèi)部交換網(wǎng)絡(luò)成為瓶頸
- 上CDN
熱點(diǎn)數(shù)據(jù)處理
秒殺商品在很短時(shí)間內(nèi)被查詢和訪問装处。熱點(diǎn)請(qǐng)求會(huì)占用服務(wù)器大量資源误债,熱點(diǎn)請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)就是熱點(diǎn)數(shù)據(jù),熱點(diǎn)數(shù)據(jù)區(qū)分靜態(tài)熱點(diǎn)數(shù)據(jù)和靜態(tài)熱點(diǎn)數(shù)據(jù)妄迁。
發(fā)現(xiàn)靜態(tài)熱點(diǎn)數(shù)據(jù)
可以通過商業(yè)手段發(fā)現(xiàn)靜態(tài)熱點(diǎn)數(shù)據(jù)寝蹈,例如讓商戶提前報(bào)名參加秒殺活動(dòng),得到靜態(tài)熱點(diǎn)數(shù)據(jù)判族。該方案實(shí)時(shí)性比較差躺盛。
發(fā)現(xiàn)動(dòng)態(tài)熱點(diǎn)數(shù)據(jù)
- 構(gòu)建熱點(diǎn)收集異步系統(tǒng),收集交易鏈路中的各個(gè)環(huán)節(jié)熱點(diǎn)key形帮,例如nginx槽惫、rpc周叮、中間件等。
- 建立一個(gè)熱點(diǎn)上報(bào)和按需訂閱熱點(diǎn)服務(wù)的下發(fā)規(guī)范界斜,把上游動(dòng)態(tài)發(fā)現(xiàn)的熱點(diǎn)數(shù)據(jù)下發(fā)到下游系統(tǒng)仿耽。
- 上游系統(tǒng)收集的熱點(diǎn)數(shù)據(jù)下發(fā)給下游系統(tǒng),下游系統(tǒng)提前做好熱點(diǎn)保護(hù)各薇。
熱點(diǎn)數(shù)據(jù)處理
對(duì)于熱點(diǎn)數(shù)據(jù)的處理包括项贺,優(yōu)化、限制峭判、隔離开缎。
- 優(yōu)化:緩存熱點(diǎn)數(shù)據(jù),做好動(dòng)靜熱點(diǎn)數(shù)據(jù)分離林螃;緩存采用lru淘汰策略替換熱點(diǎn)數(shù)據(jù)
- 限制:防止熱點(diǎn)數(shù)據(jù)占用太多服務(wù)器資源奕删,而其他請(qǐng)求得不到處理。將請(qǐng)求根據(jù)商品id做分桶處理疗认。
- 隔離:將熱點(diǎn)數(shù)據(jù)隔離出來完残,不要讓1%的請(qǐng)求影響另外99%的請(qǐng)求。業(yè)務(wù)隔離(提前報(bào)名和熱點(diǎn)預(yù)熱)横漏;系統(tǒng)隔離(申請(qǐng)不同的域名和單獨(dú)部署)谨设;數(shù)據(jù)隔離(單獨(dú)的cache層和mysql存放熱點(diǎn)數(shù)據(jù))。
流量消峰如何處理
服務(wù)器的處理能力是恒定的缎浇,當(dāng)秒殺出現(xiàn)流量峰值時(shí) 很容易導(dǎo)致服務(wù)處理不過來扎拣。消峰的存在是可以讓服務(wù)器更加平滑的運(yùn)行。
隊(duì)列排隊(duì)
把同步的請(qǐng)求轉(zhuǎn)換為異步請(qǐng)求华畏,通過隊(duì)列接受流量洪峰鹏秋,服務(wù)端平滑的處理隊(duì)列里的請(qǐng)求信息。
延時(shí)請(qǐng)求
將請(qǐng)求拉長(zhǎng)亡笑,大道延時(shí)請(qǐng)求的目的侣夷。增加驗(yàn)證邏輯并且需要防止機(jī)器驗(yàn)證等。
分層過濾
分層過濾的主要思想就是仑乌,層層過濾掉無效的請(qǐng)求 讓漏斗的末端才是有效數(shù)據(jù)百拓。
- 將動(dòng)態(tài)數(shù)據(jù)緩存在前端web 緩存中,過濾掉無效的讀數(shù)據(jù)
- 對(duì)讀的數(shù)據(jù)不做強(qiáng)一致性驗(yàn)證
- 對(duì)寫數(shù)據(jù)做限流保護(hù)晰甚,丟棄超過負(fù)荷的請(qǐng)求
- 對(duì)寫數(shù)據(jù)做強(qiáng)一致性驗(yàn)證