秒殺活動(dòng)可以說在互聯(lián)網(wǎng)上隨處可見,從12306搶票,到聚劃算搶購,我們生活的方方面面都可以看到秒殺的身影。秒殺的架構(gòu)設(shè)計(jì)也是對(duì)于一個(gè)架構(gòu)師架構(gòu)設(shè)計(jì)能力的一次考驗(yàn)。本文的目的并不在于提供一個(gè)可以直接落地的設(shè)計(jì)方案,而是意在提供一個(gè)簡單的方法,一個(gè)思路,使大家能夠?qū)τ诿霘⒈澈蟮囊恍┰O(shè)計(jì)有更感性的認(rèn)識(shí), 并且可以自己親自動(dòng)手實(shí)踐一下。所有的配置及源碼都在本文最后的GitHub repository中可以找到。
首先,先簡單介紹下本文中會(huì)涉及到的一些組件,如下圖所示:
JMeter:用JMeter來模擬秒殺活動(dòng)中大量并發(fā)的用戶請(qǐng)求
Seckill Service:基于Nodejs使用Express實(shí)現(xiàn)的秒殺service,圖中的步驟2,3,4都是在這個(gè)service中處理的
Redis:一個(gè)Redis的docker container,在其中保存一個(gè)名為counter的數(shù)據(jù)來表示當(dāng)前剩余的庫存大小
Kafka: 一個(gè)Kafka的docker container,其實(shí)這里還有一個(gè)zookeeper的docker container,Kafka用zookeeper來存放一些元數(shù)據(jù),在程序中并沒有涉及到,所以也就不單獨(dú)列出來說了。Seckill service在更新完Redis之后,會(huì)發(fā)送一條消息給Kafka表示一次成功的秒殺
Seckill Kafka Consumer: 基于Nodejs的Kafka consumer,會(huì)從Kafka中去獲取秒殺成功的消息,處理并且存儲(chǔ)到MySQL中
MySQL:一個(gè)MySQL的docker container,最終秒殺成功的請(qǐng)求都會(huì)對(duì)應(yīng)著數(shù)據(jù)庫表中的一條記錄
環(huán)境搭建
1 . 安裝JMeter
從官網(wǎng)下載一個(gè)JMeter的binary包,執(zhí)行bin目錄下的jmeter即可啟動(dòng),啟動(dòng)后如下圖新建一個(gè)名為Seckill的Thread Group,并且設(shè)置在5s內(nèi)發(fā)起2000次并發(fā)請(qǐng)求。