秒殺專(zhuān)題-系統(tǒng)前端設(shè)計(jì)(二)
在大致分析秒殺系統(tǒng)的后端處理思路之后皆辽,來(lái)分析一下系統(tǒng)前端需要解決的問(wèn)題:
惡意請(qǐng)求
鏈接暴露
惡意請(qǐng)求
Nginx負(fù)責(zé)均衡透绩,同時(shí)攔截異常請(qǐng)求
屏蔽ip地址
屏蔽user-agent
屏蔽代理ip,有兩種情形會(huì)需要屏蔽代理ip:一是代理ip訪問(wèn)棋弥,二是負(fù)載均衡(real-ip請(qǐng)求負(fù)載均衡服務(wù)器核偿,再代理給后端server)
鏈接暴露
鏈接暴露的問(wèn)題十分明顯了,如果秒殺鏈接提前被人知曉顽染,那么在正式開(kāi)始秒殺前就已經(jīng)可以下單漾岳。即使在后端做了時(shí)間校驗(yàn),對(duì)于普通的用戶仍然是不公平的粉寞,可以寫(xiě)好腳本蝗羊,按時(shí)間進(jìn)行大量并發(fā)請(qǐng)求,從而讓真正的用戶搶不到商品仁锯。所以有必要提供一種url
的動(dòng)態(tài)化耀找。
前端代碼如下:
function getMiaoshaPath() {
$.ajax({
url :"/miaosha/getPath",
type : "GET",
data:{
goodsId :$("#goodsId").val(),
verifyCode : $("#verifyCode").val()
},
success:function(data){
if (data.code ==0) {//
var path = data.data
domiaosha(path)
}else {
layer.msg(data.message)
}
},
error :function () {
layer.msg("客戶端錯(cuò)誤")
}
})
}
后端加密代碼樣例:
public static String Md5ForUrl(String url) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(url.getBytes("UTF-8"));
byte[] b = md5.digest();
int i;
StringBuffer buf = new StringBuffer();
for(int offset = 0, len = b.length; offset < len; offset++) {
i = b[offset];
if(i < 0) {
i += 256;
}
if(i < 16) {
buf.append("0");
}
buf.append(Integer.toHexString(i));
}
url = buf.toString();
System.out.println("result = " + url);
} catch (Exception e) {
e.printStackTrace();
}
return url;
}
整理流程就變化為,只有點(diǎn)擊秒殺按鈕才能獲得真正的地址進(jìn)行秒殺业崖,而后端只處理正確秒殺地址的請(qǐng)求野芒。示意圖如下:
可以看到真正的秒殺URL和秒殺服務(wù)在秒殺開(kāi)啟前都不可能獲取,也就杜絕了黃牛根據(jù)url
提前寫(xiě)好腳本沖擊服務(wù)器双炕。
但是狞悲,這種情況仍然不能解決 利用 按鍵精靈或者 機(jī)器人 頻繁點(diǎn)擊按鈕的操作,為了降低點(diǎn)擊按鈕的次數(shù)妇斤,以及高并發(fā)下摇锋,防止多個(gè)用戶在同一時(shí)間內(nèi)丹拯,并發(fā)出大量請(qǐng)求,加入數(shù)學(xué)公式圖形驗(yàn)證碼等防高并發(fā)優(yōu)化荸恕。
更進(jìn)一步
在現(xiàn)在前后端分離開(kāi)發(fā)的大背景下乖酬,前端的頁(yè)面多半不需要通過(guò)后端服務(wù)器來(lái)獲取。所以可以考慮將頁(yè)面資源靜態(tài)化融求,將必要的秒殺頁(yè)面加入到cdn服務(wù)器中咬像,這樣開(kāi)啟秒殺服務(wù)的時(shí)候可以減少前端的壓力。
同時(shí)生宛,也不應(yīng)該讓秒殺頁(yè)面中的按鈕可以一直點(diǎn)擊县昂,一來(lái)給服務(wù)器憑空增加很多處理壓力,二來(lái)給黃畔菥耍可以利用的空間倒彰,按鈕最好是點(diǎn)擊一次之后幾秒內(nèi)置灰,同時(shí)后端也需要做好配合工作莱睁,檢查同一用戶的請(qǐng)求間隔狸驳,直接返回過(guò)于頻繁的請(qǐng)求。
單機(jī)無(wú)法處理的并發(fā)量缩赛,加上機(jī)器數(shù)量構(gòu)建集群一定可以解決。構(gòu)建Redis
集群撰糠,提高系統(tǒng)的可用性酥馍,當(dāng)然同樣的,一旦加上了集群阅酪,系統(tǒng)的復(fù)雜度就直線上升了旨袒。而且Redis
本身還存在的,緩存穿透和緩存雪崩也是需要解決的問(wèn)題术辐。那么下一篇就Redis
相關(guān)問(wèn)題進(jìn)行簡(jiǎn)單分析砚尽。