秒殺系統 流量削峰技術 秒殺令牌

2021-10-05 22:04:10 字數 2416 閱讀 8477

生成秒殺令牌

@override

public string generatesecondkilltoken(integer promoid, integer itemid, integer userid)

if (promomodel.getstarttime().isafternow()) else if (promomodel.getendtime().isbeforenow()) else

// 1. 判斷活動是否正在進行

if (promomodel.getstatus().intvalue() != 2)

// 2. 校驗商品資訊和使用者資訊

itemmodel itemmodel = itemservice.getitembyidincache(itemid);

if (itemmodel == null)

usermodel usermodel = userservice.getuserbyidincache(userid);

if (usermodel == null)

// 3. 生成秒殺令牌,並存入 redis 中

string token = uuid.randomuuid().tostring().replace("-", "");

redistemplate.opsforvalue().set("promo_token_" + promoid + "_userid_" + userid + "_itemid_" + itemid, token);

redistemplate.expire("promo_token_" + promoid + "_userid_" + userid + "_itemid_" + itemid, 5, timeunit.minutes);

return token;

}

增加生成秒殺令牌的介面

@responsebody

public commonreturntype generatetoken(@requestparam(name = "itemid") integer itemid,

@requestparam(name = "promoid") integer promoid) throws busines***ception

usermodel usermodel = (usermodel) redistemplate.opsforvalue().get(token);

if (usermodel == null)

// 生成秒殺令牌

string promotoken = promoservice.generatesecondkilltoken(promoid, itemid, usermodel.getid());

if (promotoken == null)

return commonreturntype.create(promotoken);}

下單介面增加對秒殺令牌的校驗邏輯

@responsebody

public commonreturntype createorder(@requestparam(name = "itemid") integer itemid,

@requestparam(name = "amount") integer amount,

@requestparam(name = "promoid", required = false) integer promoid,

@requestparam(name = "promotoken", required = false) string promotoken)

throws busines***ception

usermodel usermodel = (usermodel) redistemplate.opsforvalue().get(token);

if (usermodel == null)

// 校驗秒殺令牌是否正確

if (promoid != null)

if (!stringutils.equals(promotoken, inredispromotoken))

}// 判斷庫存是否已經售罄,若對應的售罄 key 存在,則直接返回下單失敗

if (redistemplate.haskey("promo_item_stock_invalid_" + itemid))

// 在 rocketmq 的事務型訊息中完成下單操作

string stocklogid = itemservice.initstocklog(itemid, amount);

if(!mqproducer.transactionasyncreducestock(usermodel.getid(), promoid, itemid, amount, stocklogid))

return commonreturntype.create(null);}

專案 流量削峰技術

秒殺令牌的原理和使用方法 秒殺大閘的原理和使用方法 佇列洩洪的原理和使用方式 存在缺點 秒殺下單介面會被指令碼不停的刷 秒殺驗證邏輯和秒殺下單介面強關聯,冗餘度高 秒殺驗證邏輯複雜,對交易系統產生無關聯負載 秒殺介面需要依靠令牌才能進入 秒殺的令牌由秒殺活動模組負責生成 秒殺活動模組對秒殺令牌生成全...

秒殺業務場景如何削峰

流量削峰這個概念主要來自於網際網路的業務場景。例如春節火車票搶購,大量的使用者需要同一時間去搶購 又例如阿里的雙十一秒殺,短時間內上億的使用者湧入,瞬間流量巨大 高併發 具體就是,300萬人在凌晨0點搶購一件數量只有500件的商品,最後能購買到的只有300萬人中的這500人。從業務上來說,這種秒殺活...

如何解決秒殺業務的削峰場景

主要是還是來自於網際網路的業務場景,例如,馬上即將開始的春節火車票搶購,大量的使用者需要同一時間去搶購 以及大家熟知的阿里雙11秒殺,短時間上億的使用者湧入,瞬間流量巨大 高併發 比如 200萬人準備在凌晨12 00準備搶購一件商品,但是商品的數量缺是有限的100 500件左右。這樣真實能購買到該件...