1. 程式人生 > >應用服務防刷策略

應用服務防刷策略

最近工作中遇到一個問題,公司運營團隊(約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>