你認(rèn)為項(xiàng)目中最重要的過(guò)程是那些?
分析、設(shè)計(jì)階段 盡量找出進(jìn)度的優(yōu)先級(jí)。
1.設(shè)計(jì)難點(diǎn):
并發(fā)量大,應(yīng)用、數(shù)據(jù)庫(kù)都承受不了。另外難控制超賣(mài)。
2.設(shè)計(jì)要點(diǎn):
將請(qǐng)求盡量攔截在系統(tǒng)上游,html盡量靜態(tài)化,部署到cdn上面。按鈕及時(shí)設(shè)置為不可用,禁止用戶(hù)重復(fù)提交請(qǐng)求。
設(shè)置頁(yè)面緩存,針對(duì)同一個(gè)頁(yè)面和uid一段時(shí)間內(nèi)返回緩存頁(yè)面。
數(shù)據(jù)用緩存抗,不直接落到數(shù)據(jù)庫(kù)。
讀數(shù)據(jù)的時(shí)候不做強(qiáng)一致性教研,寫(xiě)數(shù)據(jù)的時(shí)候再做。
在每臺(tái)物理機(jī)上也緩存商品信息等等變動(dòng)不大的相關(guān)的數(shù)據(jù)
像商品中的標(biāo)題和描述這些本身不變的會(huì)在秒殺開(kāi)始之前全量推送到秒殺機(jī)器上并一直緩存直到秒殺結(jié)束。
像庫(kù)存這種動(dòng)態(tài)數(shù)據(jù)會(huì)采用被動(dòng)失效的方式緩存一定時(shí)間(一般是數(shù)秒),失效后再去Tair緩存拉取最新的數(shù)據(jù)。
如果允許的話(huà),用異步的模式,等緩存都落庫(kù)之后再返回結(jié)果。
如果允許的話(huà),增加答題教研等驗(yàn)證措施。
其他業(yè)務(wù)和技術(shù)保障措施:
業(yè)務(wù)隔離。把秒殺做成一種營(yíng)銷(xiāo)活動(dòng),賣(mài)家要參加秒殺這種營(yíng)銷(xiāo)活動(dòng)需要單獨(dú)報(bào)名,從技術(shù)上來(lái)說(shuō),賣(mài)家報(bào)名后對(duì)我們來(lái)說(shuō)就是已知熱點(diǎn),當(dāng)真正開(kāi)始時(shí)我們可以提前做好預(yù)熱。
系統(tǒng)隔離。系統(tǒng)隔離更多是運(yùn)行時(shí)的隔離,可以通過(guò)分組部署的方式和另外 99% 分開(kāi)。秒殺還申請(qǐng)了單獨(dú)的域名,目的也是讓請(qǐng)求落到不同的集群中。
數(shù)據(jù)隔離。秒殺所調(diào)用的數(shù)據(jù)大部分都是熱數(shù)據(jù),比如會(huì)啟用單獨(dú) cache 集群或 MySQL 數(shù)據(jù)庫(kù)來(lái)放熱點(diǎn)數(shù)據(jù),目前也是不想0.01%的數(shù)據(jù)影響另外99.99%。
另外需要復(fù)習(xí)緩存穿透、雪崩等等問(wèn)題,主要的流量都落在了緩存數(shù)據(jù)庫(kù)上,需要針對(duì)緩存數(shù)據(jù)庫(kù)的高可用作保障。
短鏈接生成
這個(gè)應(yīng)該是比較公認(rèn)的方案了:
分布式ID生成器產(chǎn)生ID
ID轉(zhuǎn)62進(jìn)制字符串
記錄數(shù)據(jù)庫(kù),根據(jù)業(yè)務(wù)要求確定過(guò)期時(shí)間,可以保留部分永久鏈接
主要難點(diǎn)在于分布式ID生成。鑒于短鏈一般沒(méi)有嚴(yán)格遞增的需求,可以使用預(yù)先分發(fā)一個(gè)號(hào)段,然后生成的方式。
看了下新浪微博的短鏈接,8位,理論上可以保存超過(guò)200萬(wàn)億對(duì)關(guān)系,具體怎么存儲(chǔ)的還有待研究。