高并發(fā)場(chǎng)景下,TPS如何突破5萬(wàn)并發(fā)?
高并發(fā)
在當(dāng)今互聯(lián)網(wǎng)時(shí)代,無(wú)論是電商平臺(tái)的促銷活動(dòng),還是社交媒體的熱點(diǎn)事件,都可能瞬間涌入大量的用戶請(qǐng)求。
圖片
高并發(fā)帶來(lái)的挑戰(zhàn)是巨大的:服務(wù)器資源緊張、響應(yīng)速度變慢、甚至系統(tǒng)崩潰。
TPS突破5萬(wàn)對(duì)于許多大規(guī)模在線業(yè)務(wù)而言,是一個(gè)關(guān)鍵的技術(shù)目標(biāo)。
TPS(Transactions Per Second):是衡量系統(tǒng)每秒處理事務(wù)數(shù)量的標(biāo)準(zhǔn)指標(biāo)。
圖片
TPS反映了系統(tǒng)的吞吐能力,它直接關(guān)系到系統(tǒng)的性能、響應(yīng)時(shí)間和用戶體驗(yàn)。
具體來(lái)說(shuō),5萬(wàn)TPS代表著系統(tǒng)每秒可以處理50,000個(gè)事務(wù),這對(duì)于大多數(shù)電商平臺(tái)、金融交易系統(tǒng)、社交應(yīng)用等場(chǎng)景來(lái)說(shuō)是一個(gè)巨大的挑戰(zhàn)。
突破這一目標(biāo)意味著架構(gòu)能夠處理更加復(fù)雜的業(yè)務(wù)請(qǐng)求,同時(shí)也能夠應(yīng)對(duì)突發(fā)的流量高峰。
我們需要深入分析,究竟是什么樣的架構(gòu),才能夠支撐如此高的并發(fā)。
如何支撐高并發(fā)?
當(dāng)TPS達(dá)到5萬(wàn)時(shí),系統(tǒng)將面臨諸多挑戰(zhàn)。
首先,數(shù)據(jù)庫(kù)的訪問(wèn)成為瓶頸。
因?yàn)樵诟卟l(fā)的情況下,大量的數(shù)據(jù)庫(kù)查詢、和寫入操作可能導(dǎo)致數(shù)據(jù)庫(kù)的負(fù)載過(guò)高,響應(yīng)時(shí)間延遲。
這個(gè)時(shí)候,可以考慮“分庫(kù)分表”,將數(shù)據(jù)分散存儲(chǔ),避免單一數(shù)據(jù)庫(kù)的壓力過(guò)大。
圖片
通過(guò)分庫(kù)分表,可以將不同的數(shù)據(jù)存儲(chǔ)到不同的數(shù)據(jù)庫(kù)中,使得不同數(shù)據(jù)表的讀寫操作能夠并行執(zhí)行,提高并發(fā)性能。
阿里巴巴的電商平臺(tái),例如淘寶、天貓,面對(duì)的是海量用戶、商品和訂單,單一數(shù)據(jù)庫(kù)顯然無(wú)法支撐。
因此,分庫(kù)拆分是其架構(gòu)設(shè)計(jì)的必然選擇。
業(yè)務(wù)領(lǐng)域劃分
將核心業(yè)務(wù)領(lǐng)域獨(dú)立拆分,形成獨(dú)立的數(shù)據(jù)庫(kù),實(shí)現(xiàn)業(yè)務(wù)隔離和數(shù)據(jù)解耦。
確保每個(gè)數(shù)據(jù)庫(kù)承擔(dān)明確的業(yè)務(wù)職責(zé)。
常見的分庫(kù)包括:
圖片
用戶庫(kù):存儲(chǔ)用戶信息、賬戶信息...等。
商品庫(kù):存儲(chǔ)商品信息、庫(kù)存信息...等。
訂單庫(kù):存儲(chǔ)訂單信息、支付信息...等。
交易庫(kù):存儲(chǔ)交易信息,支付信息...等。
店鋪庫(kù):存儲(chǔ)店鋪信息...等。
還可以,按用戶ID范圍、或哈希取模,進(jìn)一步拆分成多個(gè)表。
比如user_table_01、user_table_02....,分散壓力。
讀寫分離
通過(guò)主從數(shù)據(jù)庫(kù)復(fù)制,讀操作由從數(shù)據(jù)庫(kù)處理,寫操作由主數(shù)據(jù)庫(kù)處理,減輕主數(shù)據(jù)庫(kù)的負(fù)擔(dān)。
讀寫分離的核心是主從復(fù)制,主數(shù)據(jù)庫(kù)(主庫(kù))負(fù)責(zé)處理所有的寫操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫(kù)(從庫(kù))則復(fù)制主庫(kù)的數(shù)據(jù),并處理讀操作(SELECT)。
主庫(kù)將寫操作的日志(例如,MySQL的binlog)同步到從庫(kù),從庫(kù)通過(guò)執(zhí)行這些日志來(lái)保持與主庫(kù)數(shù)據(jù)的一致性。
高性能緩存
分布式緩存系統(tǒng)是高并發(fā)架構(gòu)中的關(guān)鍵組成部分,通過(guò)使用如Redis、Memcached...等,緩存系統(tǒng)。
緩存系統(tǒng)通常用于存儲(chǔ):熱點(diǎn)數(shù)據(jù)、查詢結(jié)果等高頻訪問(wèn)的數(shù)據(jù),可以大大減少數(shù)據(jù)庫(kù)的訪問(wèn)頻率,提升響應(yīng)速度。
但也需要考慮,在高并發(fā)流量的情況下,穿透、雪崩...等等場(chǎng)景。
圖片
緩存穿透
緩存穿透是指查詢一個(gè)不存在的數(shù)據(jù),緩存和數(shù)據(jù)庫(kù)中都沒(méi)有這條數(shù)據(jù),導(dǎo)致每次請(qǐng)求都會(huì)直接訪問(wèn)數(shù)據(jù)庫(kù)。
如果大量請(qǐng)求查詢不存在的數(shù)據(jù),數(shù)據(jù)庫(kù)會(huì)承受巨大的壓力,甚至崩潰。
解決方案
使用布隆過(guò)濾器來(lái)判斷請(qǐng)求的數(shù)據(jù)是否存在。
布隆過(guò)濾器是一種高效的數(shù)據(jù)結(jié)構(gòu),可以快速判斷一個(gè)元素是否存在于集合中。
如果布隆過(guò)濾器判斷數(shù)據(jù)不存在,則直接返回,避免訪問(wèn)緩存和數(shù)據(jù)庫(kù)。
緩存雪崩
緩存雪崩是指大量緩存數(shù)據(jù)在同一時(shí)間失效,導(dǎo)致大量請(qǐng)求直接訪問(wèn)數(shù)據(jù)庫(kù),造成數(shù)據(jù)庫(kù)壓力過(guò)大,甚至崩潰。
解決方案:
設(shè)置隨機(jī)過(guò)期時(shí)間,來(lái)解決。
為緩存數(shù)據(jù)設(shè)置隨機(jī)的過(guò)期時(shí)間,避免大量緩存數(shù)據(jù)同時(shí)失效。
緩存預(yù)熱
在系統(tǒng)啟動(dòng)時(shí),提前加載熱點(diǎn)數(shù)據(jù)到緩存中,避免大量請(qǐng)求直接訪問(wèn)數(shù)據(jù)庫(kù)。
使用多級(jí)緩存,例如,本地緩存和分布式緩存結(jié)合使用。
構(gòu)建高可用緩存集群
對(duì)于redis等緩存服務(wù),做集群,或者使用哨兵模式,避免單點(diǎn)故障,提高可用性。
流量削峰
通過(guò)消息隊(duì)列(如Kafka、RocketMQ...等),可以將高峰流量中的請(qǐng)求異步地推送到隊(duì)列中,消費(fèi)者按照設(shè)定的速率從隊(duì)列中取出消息進(jìn)行處理。
這樣,系統(tǒng)可以在流量較低時(shí)處理請(qǐng)求,避免了系統(tǒng)因瞬時(shí)高并發(fā)而崩潰。
例如,在電商平臺(tái)中,用戶下單后,可以將支付請(qǐng)求通過(guò)消息隊(duì)列推送到處理隊(duì)列,由后臺(tái)異步處理支付請(qǐng)求,避免高并發(fā)時(shí)同步處理的壓力。
以及,在秒殺活動(dòng)中,用戶的請(qǐng)求量可能會(huì)激增,消息隊(duì)列可以幫助將大量請(qǐng)求排入隊(duì)列中,逐步處理,以避免系統(tǒng)崩潰。