應(yīng)對(duì)「高并發(fā)」的思路
這里是Z哥的個(gè)人公眾號(hào)
每周五11:45 按時(shí)送達(dá)
當(dāng)然了,也會(huì)時(shí)不時(shí)加個(gè)餐~
我的第「191」篇原創(chuàng)敬上
TPS。每秒事務(wù)處理量,這里的事務(wù)是指一個(gè)客戶機(jī)向服務(wù)器發(fā)送請(qǐng)求然后服務(wù)器做出反應(yīng)的過(guò)程。(以客戶端為視角)
QPS。每秒查詢率,可以通過(guò)并發(fā)量 / 平均響應(yīng)時(shí)間計(jì)算得出。(以服務(wù)端為視角,一個(gè)TPS可能會(huì)對(duì)應(yīng)多個(gè)QPS)
并發(fā)用戶數(shù)。系統(tǒng)可以同時(shí)承載的正常使用系統(tǒng)功能的用戶的數(shù)量。
響應(yīng)時(shí)間。很多時(shí)候也叫RT,是指系統(tǒng)對(duì)請(qǐng)求作出響應(yīng)的時(shí)間。
帶寬。如果是一個(gè)數(shù)據(jù)傳輸量比較大的業(yè)務(wù),還需要考慮帶寬問(wèn)題,比如視頻、音頻類(lèi)應(yīng)用程序。
獲取購(gòu)物車(chē)列表,存在兩次調(diào)用,QPS = 200。
批量獲取商品庫(kù)存,存在三次調(diào)用,QPS = 300。
獲取會(huì)員信息,存在一次調(diào)用,QPS = 100。
……
獲取購(gòu)物車(chē)列表,出現(xiàn)在三個(gè)業(yè)務(wù)線,QPS = 200 + 500 + 100 = 800。
批量獲取商品庫(kù)存,出現(xiàn)在兩個(gè)業(yè)務(wù)線,QPS = 300 + 200 = 500。
獲取會(huì)員信息,出現(xiàn)在兩個(gè)業(yè)務(wù)線,QPS = 100 + 200 = 300。
……
先在代碼層面做優(yōu)化,比如代碼性能,多線程,請(qǐng)求合并,池化(連接池、線程池、對(duì)象池等等)。
能升級(jí)硬件的就升級(jí)硬件。
能用緩存解決的堅(jiān)決不做系統(tǒng)拆分。并且,緩存盡可能做到上游。比如, cdn >頁(yè)面> api > service 。
如果在數(shù)據(jù)處理上產(chǎn)生瓶頸,那么優(yōu)先考慮業(yè)務(wù)上是否接受異步,如果接受,那么用 MQ 來(lái)削峰填谷。或者限流降級(jí)。
如果 MQ 也不頂用,是整體吞吐量上的瓶頸的話,只要不是寫(xiě)數(shù)據(jù)的瓶頸,盡量通過(guò)程序拆分而不是數(shù)據(jù)庫(kù)拆分來(lái)解決問(wèn)題。(此時(shí)需要引入服務(wù)治理,另外,會(huì)存在一致性問(wèn)題,數(shù)據(jù)合并問(wèn)題要解決)
非得動(dòng)到數(shù)據(jù)層面的話,優(yōu)先考慮數(shù)據(jù)庫(kù)讀寫(xiě)分離,而不是直接拆分?jǐn)?shù)據(jù)。
實(shí)在迫不得已需要拆分?jǐn)?shù)據(jù),優(yōu)先考慮根據(jù)業(yè)務(wù)垂直拆分,而不是水平拆分。(水平拆分的數(shù)據(jù)合并代價(jià)會(huì)比垂直拆分更大)
最后才是數(shù)據(jù)庫(kù)水平拆分,支持無(wú)限擴(kuò)容,一勞永逸。
梳理請(qǐng)求流轉(zhuǎn)鏈路
確定目標(biāo)
制定具體的優(yōu)化方案
推薦閱讀:
原創(chuàng)不易,如果你覺(jué)得這篇文章還不錯(cuò),就「點(diǎn)贊」或者「在看」一下吧,鼓勵(lì)我的創(chuàng)作 :)
也可以分享我的公眾號(hào)名片給有需要的朋友們。
如果你有關(guān)于軟件架構(gòu)、分布式系統(tǒng)、產(chǎn)品、運(yùn)營(yíng)的困惑
可以試試點(diǎn)擊「閱讀原文」
