應用服務防刷策略
阿新 • • 發佈:2018-11-05
最近工作中遇到一個問題,公司運營團隊(約100人)要對每日的訂單進行稽核,一般早上單量比較集中,但是到了下午單量就會變少,所以這邊客服為了保證能夠實時的進行有訂單進來,一直會按著F5重新整理頁面,有時候確實沒單子,但是100人同時一直按著F5不鬆手,導致伺服器壓力很大,觀察日誌一個客服評價每秒鐘請求量達到3次。一個服務介面5分鐘的請求量達到8w,多麼可怕的一個數字。
所以針對這個介面,利用redis,在後臺做了限流處理。大致邏輯是:
1.針對某一個客服,5秒鐘請求量達到5次,跳轉到休息頁,倒計時5秒鐘重新回到審單頁面。
2.否則的話正常執行。
具體限流程式碼
//加一個限流 Long inc = 0L; boolean exsits = jimRedisService.exsits(RxConstant.DISTRIBUTED_RECEIVE_LIMIT_NUM + WebHelper.getPin()); if (exsits) { inc = jimRedisService.inc(RxConstant.DISTRIBUTED_RECEIVE_LIMIT_NUM + WebHelper.getPin()); logger.info("inc->num:pin:{},inrcNum:{}", WebHelper.getPin(), inc); } else { jimRedisService.setEx(RxConstant.DISTRIBUTED_RECEIVE_LIMIT_NUM + WebHelper.getPin(), "1", 3, TimeUnit.SECONDS); } if (inc > 5) { try { jimRedisService.del(RxConstant.DISTRIBUTED_RECEIVE_LIMIT_NUM + WebHelper.getPin()); model.addAttribute("timestamp", System.currentTimeMillis()); //轉到超時限制頁 return "frewarn"; } catch (Exception e) { logger.error("limit num error:{}", e); } }
frewarn.jsp頁面
<style type="text/css"> .changeFont { color: red; font-size: 18px; } </style> <div class="row" style="padding-top: 10%"> <div class="col-md-4 col-md-offset-4" style="width: 250px"> <span id="spanTime"></span> <div class="alert alert-danger" role="alert"> <strong>重新整理太頻繁了,休息一下再工作吧!</strong><br/><br/> <a href="/distributeCategoryList?t=${timestamp}"><b>轉到列表頁</b></a> </div> </div> </div> <script type="text/javascript"> window.onload = function () { //1.首先宣告seconds var seconds = 3; //2.宣告定時器 var timer = null; //3.開啟定時器 timer = setInterval(show, 1000); //開啟定時器後要執行的函式 function show() { if (seconds == 0) { clearInterval(timer);//清除定時器 // window.location.href = "http://test.rx.man.jd.com/distributeCategoryList";//跳轉到百度首頁 window.location = "/distributeCategoryList?t=" + new Date().getTime();//跳轉到百度首頁 return; } //將不斷變化的秒數顯示在頁面上 document.getElementById('spanTime').innerHTML = '<span class="changeFont">' + seconds + '</span>' + "秒後返回稽核頁面!"; //這裡新增的class僅僅是為了改變 變化的秒數的樣式 seconds--; } }; </script>