【Java】關於項目啓動大請求量高負載時如何確保db等資源不出錯的問題

若是一個項目啓動時(單機), 瞬間來了1000個訪問, 如何確保db等資源不會壓垮呢?java

如今想一想我當時回答的並很差, 而如今看公司框架才發現其實有針對於這一塊作過專門的優化的。
下面就來分享下公司關於這個地方的處理, 一句話總結就是:項目啓動時會先熱身一段時間,機率性拒絕請求以保證服務的高可用。markdown

下面直接說原理:
1, 根據本身的業務需求設置一個熱身時間:warmupTime
2, 在服務啓動接收請求的時候添加一個攔截器,若是項目尚未熱身完就機率性中止對外服務。(這裏使用random去計算時候返回正常的響應)
3, 等熱身完畢的時候提供完整的響應。併發

使用場景:
特別適用於單機服務(雙機由於有負載均衡因此沒必要考慮這個問題),且併發較高的服務。使用熱身的主要緣由是:當系統初始化時緩慢增長請求,防止系統開始壓力過大致使db等資源出錯。負載均衡

下面直接貼代碼, 用代碼來說解:框架

@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { processRequest(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { processRequest(req, resp); } protected void processRequest(HttpServletRequest requestOld, HttpServletResponse response) throws ServletException, IOException { // 當系統初始化時緩慢增長請求,防止系統開始壓力過大致使db等資源出錯 if (!bootHandler.isOk() && bootHandler.handle(requestOld, response, config)) { return; } //... }

在接收到請求時會先去判斷是否熱身完畢, bootHandler.handle就是判斷熱身的方法,具體判斷方式以下代碼:dom

public boolean handle(HttpServletRequest request, HttpServletResponse response, MvcConfig config) throws IOException { long warmupTime = config.getWarmupTime(); String startingUpJson = config.getStartingUpJson(); if (warmupTime <= 0) { ok = true; } else { long now = System.currentTimeMillis(); if (startTime == -1 || startTime == 0) { if (startTime == -1) { startTime = now; LOG.info("收到第一個請求,開始進行熱身"); } RenderUtils.renderJson(request, response, startingUpJson); return true; } else { //從開始時間到如今,以及配置的熱身時間計算當前服務的比例 if (now >= startTime + warmupTime) { ok = true; } else { //比率是從 [0-100) int rate = (int) ((now - startTime) * 100 / warmupTime); boolean rejected = random.nextInt(100) > rate; if (rejected) { if (now - lastLogTime.get() > 1000L) { lastLogTime.set(now); LOG.warn("當前請求被拒絕,當前響應機率爲:{}%", rate); } renderJson(request, response, startingUpJson); return true; } } } } return false; }

首先回去判斷是否配置了熱身時間, 若是沒有配置那麼直接返回。
接着就去用當前的時間和項目啓動時間以及熱身時間計算出比率, 而後經過random去判斷當前請求是否返回響應。直到熱身完, 比率會達到100%。ide

下面貼一張項目啓動時的Log:
post

雖然這是一種很簡單的方式處理項目啓動時資源不可用的解決方法, 可是卻對項目啓動時帶來很大的幫助, 但願這種方法可以對你們有用。優化

相關文章
相關標籤/搜索