網(wǎng)購秒殺系統(tǒng)架構(gòu)設(shè)計案例分析
秒殺架構(gòu)分為以下幾個方面
- 前端頁面 + 網(wǎng)關(guān) + 服務(wù)層 + 緩存層 + 中間件 + db 層
數(shù)據(jù)的流向就是
- 用戶在前端頁面下單的時候 請求通過網(wǎng)關(guān)打到服務(wù)層 服務(wù)層通過redis 的一些處理谚攒,將能夠正確秒殺的用戶數(shù)據(jù)寫入nsq,后續(xù)進行db層的扣減庫存加訂單的操作了
2.基于以上的數(shù)據(jù)流量 每一個模塊都有詳細要做的事情俩滥。
- 前端 頁面靜態(tài)化 + cdn
- 通過點擊按鈕 然后disable 的方式 進行前端限流
- 網(wǎng)關(guān)層 通過Kong網(wǎng)關(guān)的形式,對整體流量進行限流腾啥,監(jiān)控,負載均衡到所處的服務(wù)層
- 服務(wù)層首先需要拒絕掉重復(fù)用戶請求的流量 這個解決方式通過redis的key的設(shè)置 以上的幾部能拒絕多大部分非法請求
- 接下來就要進行流量的限流措施,我們可以使用 令牌桶算法來進行流量的把控
- 令牌桶后的流量我們通過redis 的扣減庫存后倘待,走mq的方式近一步限流削峰疮跑,
- 此時落入db的流量可以限制的很低。我們可以進行數(shù)據(jù)庫的更新操作了凸舵。通常數(shù)據(jù)庫需要查庫存祖娘,然后再update。其實使用版本號的樂觀鎖 就能防止超賣 并且一個sql 搞定
update goods set stock = stock -1 where googs_id = {goods_id} and version = {version} and stock > 0
我們需要做的還很多
- 故障演練
- 全鏈路壓測
- 限流降級措施以及異常預(yù)案
其實到這里 整個秒殺的架構(gòu)應(yīng)該是完成了啊奄,但是如果給我們更高的要求渐苏,我們還可以做到的點是。 架構(gòu)的延伸以及閉環(huán)
- 復(fù)用秒殺的模型菇夸。能夠適用于各個秒殺情況琼富。文檔化,標準化各鏈路以及代碼質(zhì)量庄新。目的是讓 后續(xù)其他部門使用秒殺的場景的時候能夠利用我們的之前研究探討好的方案鞠眉,讓他們能夠更快的開發(fā)并且使用
- 我們在復(fù)盤整個秒殺活動的時候,我們需要清晰的記錄各個機器的負載择诈,流量情況械蹋,我們分析 得與失】源樱總結(jié)成經(jīng)驗朝蜘,想想哪里我們可以做的更好。