如果一个项目启动时(单机), 瞬间来了1000个访问, 如何确保db等资源不会压垮呢?

现在想想我当时回答的并不好, 而现在看公司框架才发现其实有针对于这一块做过专门的优化的。
下面就来分享下公司关于这个地方的处理, 一句话总结就是:项目启动时会先热身一段时间,概率性拒绝请求以保证服务的高可用。

下面直接说原理:
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就是判断热身的方法,具体判断方式如下代码:

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%。

下面贴一张项目启动时的Log:

虽然这是一种很简单的方式处理项目启动时资源不可用的解决方法, 但是却对项目启动时带来很大的帮助, 希望这种方法能够对大家有用。

 

【Java】关于项目启动大请求量高负载时如何确保db等资源不出错的问题的更多相关文章

  1. Java Web项目启动执行顺序

    一. 1.启动一个WEB项目,WEB容器会先去读取它的配置文件web.xml,读取<context-param>和<listener>两个节点. 2.接着,容器创建一个Serv ...

  2. maven的java web项目启动找不到Spring ContextLoaderListener的解决办法

    用maven搭建的java web项目,上传到git仓库后,当同事clone下来项目,部署到tomcat运行时,就报了如下错误,即启动web项目时,加载web.xml文件,找不到spring的监听器, ...

  3. java web项目启动进入首页的配置方式(包含过滤跳转首页实现)

    本文为博主原创,未经允许不得转载: 项目启动成功,进入首页的方式,我们往往在web.xml 中通过以下的方式默认进入跳转首页, <welcome-file-list> <welcom ...

  4. java web 项目启动的根目录,以及项目启动后使用的端口具体是哪一个

    1.今天启动项目发现一直找不到网页,原来是自己浏览器地址的根目录出现了问题,那么系统中的根目录(也就是项目名)到底是哪个,究竟以哪个为基准? 这里有一地方不能忽视:见图片 在普通的java web项目 ...

  5. java web项目启动加载顺序

    转载:https://www.cnblogs.com/writeLessDoMore/p/6935524.html web.xml加载过程(步骤):       1.启动WEB项目的时候,容器(如:T ...

  6. 详解Java Web项目启动执行顺序

    一. web.xml加载过程(步骤): 启动web项目,容器(如Tomcat.Apache)会去读取它的配置文件web.xml 中的两个节点,context-param和listener. 紧接着,容 ...

  7. java web项目启动时自动加载自定义properties文件

    首先创建一个类 public class ContextInitListener implements ServletContextListener 使得该类成为一个监听器.用于监听整个容器生命周期的 ...

  8. java web项目启动时浏览器路径不用输入项目名称方法

    http://blog.csdn.net/qq542045215/article/details/44923851

  9. ssm项目启动,加载数据库连接池时卡住

    今天早上到公司启动项目的时候,加载数据库连接池时卡住,昨晚还好着呢,然后排查原因,最后发现是因为有一个mapper的xml配置文件中 <mapper namespace="com.mi ...

随机推荐

  1. Linux下启动weblogic服务

    第一步找到目录:cd weblogic/user_projects/domains/odm_dat_dc_domain/bin/ 第二步查看进程: ps -ef|grep java 第三步杀进程: k ...

  2. day1扩展作业

    作业一:博客作业二:编写登陆接口,●输入用户名密码(有文件存储用户名,命名)●认证成功后显示欢迎信息●输错三次后锁定(再次运行程序,还是输入上次输入的就显示已被锁定)作业三:多级菜单●三级菜单 ●可依 ...

  3. canvas和SVG

    Canvas的介绍 1.1.创建canvas元素 canvas的定义:它是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像 ...

  4. angular学习笔记(2)

    1.angular可观察对象 2.angular绑定方式 3.angular模板 4.angular生命周期 5.angular组件通信

  5. 针对小程序for循环绑定数据,实现toggle切换效果(交流QQ群:604788754)

    如有更好的方法实现,可以留言或加群交流学习.谢谢(交流QQ群:604788754) WXML: <block wx:for="{{datanum}}" wx:for-inde ...

  6. Java 面试题集锦

    都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底,老手们就不用进来了,免得笑话我们这些未出校门的孩纸们,但 ...

  7. jieba 库

    jieba库是python 一个重要的第三方中文分词函数库,但需要用户自行安装. 一.jieba 库简介 (1) jieba 库的分词原理是利用一个中文词库,将待分词的内容与分词词库进行比对,通过图结 ...

  8. [BZOJ1596]电话网络

    Problem 给你一棵树,可以在每个点上选择造塔或不造,每座塔可以覆盖这个节点和相邻节点,问覆盖整棵树的最小塔数. Solution 看到这道题的第一眼,我就觉得是一题贪心题,但看见出题的时候分类在 ...

  9. R语言求根

    求根是数值计算的一个基本问题,一般采用的都是迭代算法求解,主要有不动点迭代法.牛顿-拉富生算法.割线法和二分法. 不动点迭代法 所谓的不动点是指x=f(x)的那些点,而所谓的不懂点迭代法是指将原方程化 ...

  10. static(静态)关键字

    class Person{String name; //成员变量,实例变量(实例中的变量) //共享数据出现在对象之前static String country="cn"; //对 ...