本文是學(xué)習(xí)筆記
高并發(fā)可能發(fā)生的地方:
紅色部分可能發(fā)生高并發(fā)魔熏,綠色表示沒(méi)有影響甲捏。
優(yōu)化方案分析
-
為什么要單獨(dú)獲取系統(tǒng)時(shí)間磕蛇?
用戶操作
由于詳情頁(yè)被靜態(tài)化放到CDN節(jié)點(diǎn)上命锄,而不是秒殺系統(tǒng)服務(wù)器上,所以訪問(wèn)CDN定的時(shí)候是獲取不到系統(tǒng)的當(dāng)前時(shí)間诉字,因此需要一個(gè)單獨(dú)的請(qǐng)求來(lái)獲取系統(tǒng)當(dāng)前時(shí)間懦尝。
獲取系統(tǒng)時(shí)間不用優(yōu)化:
java訪問(wèn)一次內(nèi)存(Cacheline)大約10ns,1s=10億ns壤圃,不考慮GC1s可以做1億次陵霉。
-
秒殺地址接口分析
秒殺地址接口分析
-
秒殺操作優(yōu)化分析
秒殺操作優(yōu)化分析
其他方案分析
- NoSQL沒(méi)有Mysql穩(wěn)定。
- 開(kāi)發(fā)人員要對(duì)這些組件非常熟悉伍绳,熟悉數(shù)據(jù)一致性模型踊挠,了解自己的邏輯怎么處理回滾,比如:減庫(kù)存失敗怎么回滾冲杀,或者減完庫(kù)存訪問(wèn)MQ超時(shí)怎么回滾效床,這些都需要手動(dòng)實(shí)現(xiàn)。
- 當(dāng)減庫(kù)存的時(shí)候不知道之前這個(gè)用戶是否減過(guò)庫(kù)存权谁,一般的操作是再維護(hù)一個(gè)NoSQL的訪問(wèn)方案剩檀,用以記錄哪些用戶減過(guò)庫(kù)存。
Mysql解決方案
-
Mysql的壓測(cè)
Mysql的壓測(cè) -
Java控制事務(wù)行為分析
Java控制事務(wù)行為分析 -
瓶頸分析
瓶頸分析
新生代GC會(huì)暫停所有的Java代碼旺芽,包括事務(wù)代碼沪猴,一次GC大概幾十毫秒,并發(fā)越高采章,發(fā)生GC的次數(shù)越多运嗜。
這些執(zhí)行完了,下一個(gè)等待行鎖的線程才有機(jī)會(huì)拿到鎖悯舟,執(zhí)行第二個(gè)事務(wù)担租。
瓶頸不在于Java本身和Mysql本身,在于事務(wù)放在Java客戶端執(zhí)行抵怎,中間的通信網(wǎng)絡(luò)延遲和GC奋救。而Mysql同一行的事務(wù)是串行化執(zhí)行的。
QPS=所有的SQL執(zhí)行時(shí)間+網(wǎng)絡(luò)延遲+GC反惕。
優(yōu)化分析結(jié)論
-
延遲分析
同城機(jī)房
如何判斷Update更新庫(kù)存成功
兩個(gè)條件:
- Update自身沒(méi)報(bào)錯(cuò)
- 客戶端確認(rèn)Update影響記錄數(shù)
優(yōu)化思路:
- 把客戶端邏輯放到MySQL服務(wù)端菠镇,避免網(wǎng)絡(luò)延遲和GC影響。
如何放到MySQL服務(wù)端
兩種解決方案:
- 定制SQL方案:update/*+[auto_commit]*/承璃,需要修改MySQL源碼。
- 使用存儲(chǔ)過(guò)程:整個(gè)事務(wù)在MySQL端完成蚌本。