性能优化-请求合并

面对大量查询请求,原有的系统结构无法满足性能需求。文章介绍了两种优化方式:负载均衡和缓存、缓冲,但这些仍无法避免百万级别数据库访问。于是提出请求合并的方法,通过将前端请求缓存到队列,定时批量查询数据库,显著减少了服务层和数据库的查询次数,有效缓解高并发下的压力。然而,这也可能导致响应速度减慢和下行带宽增加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常我们的系统查询过程如下图
应用
当我们面临百万级甚至更过查询请求时,这种简单应用结构明显无法满足业务及性能要求。此时我们需要对上述结构进行优化。通常的做法有一下两种方式

  1. 负载均衡
    将应用后台集群部署,降低单个后台服务器压力。
  2. 缓存、缓冲
    服务层查询数据库时做缓存(Cache/Redis)、缓冲(MQ)

2但是上述两种优化方式中百万级别的请求依然会进行百万级别的数据库或者缓存访问。并没有降低服务层服务器、缓存服务器、数据库服务器压力。服务器又无法无限扩张,此时可以通过请求合并的方式进行优化。请求合并是将前端大量的相同内容的请求做一次中转合并,降低服务层以及数据库查询的压力。


优化前
每次前端请求都查询一次数据库

try{
   
    countDownLatch.await();
    ReqMerger reqMerger =reqMergerService.queryById(id);
    System.out.println("第"+id+"次请求,结果:"+reqMerger);
}catch (Exception ex){
   
    ex.printStackTrace();
}

测试
模拟并发1000个请求

static int THREAD_NUM=1000;
static CountDownLatch countDownLatch=new CountDownLatch(THREAD_NUM);

@ResponseBody
@RequestMapping(value="request/single",method ={
   RequestMethod.GET})
@ApiOperation(value = "测试:单次请求", notes = "测试单次请求", response = Result.class)
public void singleRequest(
        HttpServletRequest req,
        HttpServletResponse resp){
   
    for(int i=0;i<THREAD_NUM;i++){
   
        final int id=i;
        Thread thread=new Thread(()->{
   
            try{
   
                countDownLatch.await();
                //每次请求都直接通过service获取数据
                ReqMerger reqMerger =reqMergerService.queryById(id)<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值