2招解决并发问题,省几百万设备费用!说穿了很简单...
經(jīng)大佬介紹,接了個(gè)技術(shù)顧問的私活兒,3天搞定報(bào)酬8000,Mark一下,也分享下經(jīng)驗(yàn)心得。(經(jīng)大家要求,文末增加了一段接私活兒經(jīng)驗(yàn))
背景交代
甲方是廣東某國(guó)企信息部,美其名曰是邀請(qǐng)技術(shù)顧問,其實(shí)就是優(yōu)化下他們開發(fā)的一個(gè)內(nèi)部拍賣網(wǎng)站。該網(wǎng)站是面向內(nèi)部員工,限時(shí)競(jìng)拍舊的辦公筆記本,用戶量不大,但有秒殺的性質(zhì)存在,國(guó)企信息部的技術(shù)水平,你懂的。過程很簡(jiǎn)單,3天就完事兒,之前據(jù)說是打報(bào)告要花幾百萬買設(shè)備升級(jí),優(yōu)化了幾個(gè)問題后,原配置搞定!(真不是我厲害,全靠同行襯托),下面記錄2個(gè)核心問題和解決辦法,拋磚引玉歡迎拍磚。
競(jìng)拍報(bào)價(jià)失敗問題
第一個(gè)最核心的問題,就是競(jìng)拍報(bào)價(jià)總是失敗。內(nèi)部競(jìng)拍設(shè)置起拍價(jià)格非常低,用了一年的ThinkPad才1000元(福利真好),所以一上架就很多人開始發(fā)起競(jìng)拍,短時(shí)間內(nèi)會(huì)有多項(xiàng)數(shù)據(jù)寫入,然后問題來了:
之前的設(shè)計(jì),每次競(jìng)拍需要先比對(duì)價(jià)格(更高才能寫入),然后再增加報(bào)價(jià)記錄和更新當(dāng)前價(jià)格,整個(gè)過程用事務(wù)包裹起來,基于SQLServer單機(jī)數(shù)據(jù)庫根本扛不住并發(fā),各種的timeout。
重新設(shè)計(jì),直接引入了Redis的ZSet有序集合,將商品id作為key,用戶報(bào)價(jià)信息作為value,將價(jià)格信息當(dāng)成score,輕松保存并發(fā)報(bào)價(jià),而且隨時(shí)獲取當(dāng)下最高報(bào)價(jià),應(yīng)對(duì)不足1000的并發(fā)不要太輕松。
數(shù)據(jù)入庫?我設(shè)置的是每5分鐘/ZSet數(shù)據(jù)新增過100,就將數(shù)據(jù)寫入一次數(shù)據(jù)庫,一方面避免了數(shù)據(jù)庫的頻繁更新,二來最高報(bào)價(jià)也不需要競(jìng)爭(zhēng)加鎖了,于是還是單機(jī)的SQLServer服務(wù)器,應(yīng)付起來毫無壓力!
競(jìng)拍結(jié)束無數(shù)請(qǐng)求
再一個(gè)核心問題是部分熱門拍品在競(jìng)拍結(jié)束時(shí),經(jīng)常出現(xiàn)數(shù)據(jù)庫壓力過大,有時(shí)候還會(huì)down機(jī)。原因是壓軸報(bào)價(jià)人多,而此時(shí)該拍品已經(jīng)下架了,用戶還會(huì)不斷刷新,然后問題來了:
之前的設(shè)計(jì),正在競(jìng)拍的商品信息是放在本地緩存的,有效期到競(jìng)拍結(jié)束為止,競(jìng)拍期間都表現(xiàn)的很好,唯一的問題是競(jìng)拍結(jié)束時(shí),用戶還在大量刷新請(qǐng)求該商品信息,然后這一批無效請(qǐng)求都進(jìn)入數(shù)據(jù)庫了,嚴(yán)重的時(shí)候會(huì)導(dǎo)致數(shù)據(jù)庫down機(jī)。
重新設(shè)計(jì),在數(shù)據(jù)過期時(shí),不是把key-value移除,而是保存了一個(gè)key-null的緩存項(xiàng),用戶用這個(gè)key來請(qǐng)求時(shí),直接拿到null,提示用戶商品不存在或者已下架,這樣下來請(qǐng)求都不會(huì)影響到數(shù)據(jù)庫了。其實(shí)這是一個(gè)典型的緩存穿透問題。
一點(diǎn)心得體會(huì):
多會(huì)點(diǎn)東西還是很重要的,就這點(diǎn)Redis的基本應(yīng)用,就輕松掙了8000塊。在日常的互聯(lián)網(wǎng)項(xiàng)目開發(fā)中,對(duì)Redis要求高多了,單線程模型、epoll多路復(fù)用、底層數(shù)據(jù)結(jié)構(gòu)、跳躍表算法應(yīng)用、各種數(shù)據(jù)淘汰策略、集群、高可用等等,都是必備的。給大家推薦一個(gè)硬核訓(xùn)練營(yíng),3天時(shí)間突破Redis實(shí)戰(zhàn)和原理,由十多年經(jīng)驗(yàn)的硬核架構(gòu)師Clay主講的,我就是從這里學(xué)習(xí)的。
關(guān)于私活
很多小伙伴兒也想業(yè)余接點(diǎn)私活兒,我是走過彎路的,什么豬八戒網(wǎng)都是坑。今年我已經(jīng)接了2個(gè)私活兒,都是找我的在線教育老師,某微軟MVP大佬接的。老師那邊的VIP學(xué)員上萬,經(jīng)常會(huì)有各種私活兒,下圖是老師發(fā)給我的,又可以小創(chuàng)收一筆了。
關(guān)注的小伙伴兒,可以掃描二維碼,來聽聽老師的課程,混個(gè)臉熟!然后一起來協(xié)作一些大的私活兒,歡迎一起組隊(duì)!
掃碼大家一起組隊(duì)
人數(shù)較多,添加以下號(hào)碼也可哦!
微信號(hào):zhaoxihhhhh
最
新
面
試
題
庫
總結(jié)
以上是生活随笔為你收集整理的2招解决并发问题,省几百万设备费用!说穿了很简单...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WSL2 支持挂载物理磁盘,Window
- 下一篇: Kubernetes探针踩坑记