業(yè)務(wù)場景經(jīng)常會(huì)出現(xiàn)高并發(fā)讀寫的場景,不考慮圖片緩存等cdn技術(shù)穷遂,只從后臺(tái)優(yōu)化方面考慮函匕,通常解決高并發(fā)讀
的情況即是使用緩存,緩存下塞颁,放多個(gè)從庫浦箱。
現(xiàn)在主要總結(jié)一下公司在解決高并發(fā)寫的一些解決辦法。
目前團(tuán)隊(duì)面對(duì)的幾個(gè)高并發(fā)寫的場景:
1祠锣,播客發(fā)紅包酷窥,觀眾搶紅包。
2伴网,對(duì)全民主播點(diǎn)贊蓬推,掉會(huì)員
3,送禮澡腾,贊助加經(jīng)驗(yàn)
4沸伏,零點(diǎn)守護(hù)神過期,搶購守護(hù)神
解決高并發(fā)寫的三個(gè)最基本思路:
1动分,內(nèi)存計(jì)算
2毅糟,異步處理
3,多consumer消費(fèi)
公司上述場景中的搶紅包澜公,搶守護(hù)姆另,點(diǎn)贊掉會(huì)員,都屬于典型的庫存<請(qǐng)求量類的秒殺場景坟乾。
其中搶紅包流程圖如下:
1迹辐,用戶搶紅包的消息是發(fā)送至IM服務(wù)器,再又IM服務(wù)器發(fā)送至相應(yīng)的queue上甚侣,然后開啟多臺(tái)consumer進(jìn)行搶紅包消息處理明吩,對(duì)于每一條搶紅包消息,consumer消費(fèi)過后殷费,都會(huì)將結(jié)果再發(fā)送回IM服務(wù)器印荔,再由IM服務(wù)器通知前端低葫。當(dāng)應(yīng)用服務(wù)成為瓶頸時(shí),可擴(kuò)容IM服務(wù)器躏鱼,以及consumer服務(wù)器來解決氮采。
2殷绍,搶紅包前染苛,先進(jìn)行身份驗(yàn)證,將不滿足資格的用戶過濾主到。
3茶行,紅包業(yè)務(wù)采用redis計(jì)算紅包剩余數(shù)量,請(qǐng)求到來時(shí)登钥,redis直接執(zhí)行減庫存畔师,并返回剩余庫存操作,若庫存已為0牧牢,則不再走數(shù)據(jù)庫處理看锉,直接返回,若庫存存在塔鳍,再進(jìn)行后續(xù)數(shù)據(jù)庫落地操作伯铣,因?yàn)槭且劳杏趓edis實(shí)現(xiàn)對(duì)庫存實(shí)時(shí)修改與查詢,故后續(xù)數(shù)據(jù)庫落地失敗
時(shí)轮纫,需要執(zhí)行庫存+1操作腔寡。采用redis做內(nèi)存實(shí)時(shí)計(jì)算,可極大減輕高并發(fā)對(duì)庫的沖擊掌唾,基本落到庫的寫請(qǐng)求都是可成功的放前,不可成功的
請(qǐng)求多數(shù)在redis層判定后返回。這部操作也叫做用戶請(qǐng)求預(yù)處理操作糯彬。
搶紅包不涉及到扣錢凭语,所有只要考慮庫存問題,目前的實(shí)現(xiàn)比較簡單撩扒,單純的select ...for ...update
中規(guī)中矩的行級(jí)鎖表似扔,校驗(yàn),更新却舀,插記錄虫几,最后返回,并更新redis挽拔。
其實(shí)代碼還是有可以優(yōu)化的地方辆脸,執(zhí)行行級(jí)鎖之后,其他線程在執(zhí)行這個(gè)方法時(shí)螃诅,則會(huì)處于等待狀態(tài)啡氢,
所以状囱,最好將判定時(shí)間段,判定用戶是否搶過紅包等一些組裝操作倘是,都放到select...for....update外亭枷。