springboot高并发下提高吞吐量的实现

公司让做一个全文检索的项目,我使用的是elasticsearch。但是对性能有很高的要求,为了解决性能问题,我简直是寝食难安。

es(elasticsearch)没有使用分布式,单台的。

开发完测试的时候,查询慢,吞吐量低。

网友们建议用异步--使用Callable来实现、webAsyncTask、Deferred方式等,我一一尝试了之后也没有明显效果,使用压测工具发现使用前后没有一点提升。

尝试这些方法花费了我两天的时间!

在不想使用redis缓存的情况下,我想到了多线程抱着试一试的心态。

没想到吞吐量竟然翻了一倍,查询效率也瞬间提升了两个档次,完全达标,所以这里要记录一下。

其实就是一个类,放进去即可。

package com.zing.es.sample.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

@Configuration
public class GlobalConfig {

 /**
   * 默认线程池线程池
   *
   * @return Executor
   */
  @Bean
  public ThreadPoolTaskExecutor defaultThreadPool() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    //核心线程数目
    executor.setCorePoolSize(16);
    //指定最大线程数
    executor.setMaxPoolSize(300);
    //队列中最大的数目
    executor.setQueueCapacity(50);
    //线程名称前缀
    executor.setThreadNamePrefix("defaultThreadPool_");
    //rejection-policy:当pool已经达到max size的时候,如何处理新任务
    //CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
    //对拒绝task的处理策略
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    //线程空闲后的最大存活时间
    executor.setKeepAliveSeconds(60);
    //加载
    executor.initialize();
    return executor;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • spring boot高并发下耗时操作的实现方法

    高并发下的耗时操作 高并发下,就是请求在一个时间点比较多时,很多写的请求打过来时,你的服务器承受很大的压力,当你的一个请求处理时间长时,这些请求将会把你的服务器线程耗尽,即你的主线程池里的线程将不会再有空闲状态的,再打过来的请求,将会是502了. 请求流程图 http1 http2 http3 thread1 thread2 thread3 解决方案 使用DeferredResult来实现异步的操作,当一个请求打过来时,先把它放到一个队列时,然后在后台有一个订阅者,有相关主题的消息发过来时,这个

  • springboot高并发下提高吞吐量的实现

    公司让做一个全文检索的项目,我使用的是elasticsearch.但是对性能有很高的要求,为了解决性能问题,我简直是寝食难安. es(elasticsearch)没有使用分布式,单台的. 开发完测试的时候,查询慢,吞吐量低. 网友们建议用异步--使用Callable来实现.webAsyncTask.Deferred方式等,我一一尝试了之后也没有明显效果,使用压测工具发现使用前后没有一点提升. 尝试这些方法花费了我两天的时间! 在不想使用redis缓存的情况下,我想到了多线程抱着试一试的心态. 没

  • .net core如何在网络高并发下提高JSON的处理效率详解

    前言 现有的webapi一般都基于JSON的格式来处理数据,由于JSON是一个文本类的序列化协议所以在性能上自然就相对低效一些.在.net中常用Newtonsoft.Json是最常用的组件,由于提供简便基于完整的json的String方法使用起来非常方便:但也正是这原因导致Newtonsoft.Json在性能上一直被说慢,虽然Newtonsoft.Json提供Stream的方式来处理JSON不过想复用writer和reader还是需要一些应用技巧.如果需要在网络通讯中应用JSON,那在这里介绍一

  • 总结高并发下Nginx性能如何优化

    目录 特点 优势 安装和命令 配置文件 代理模式和配置反向代理 正向代理(forward proxy) : 反向代理(reverse proxy)︰ 透明代理∶ 动静分离 日志管理 日志格式 日志切割 高并发架构分析 什么是高并发? 如何提升系统的并发能力? 三种方式实现 限制连接流 限制请求流(限速) 后台服务限制 安全配置 Nginx优化 Nginx压缩 我们终将在,没有黑暗的地方相见. ~乔治<1984> Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一资源

  • java实用型-高并发下RestTemplate的正确使用说明

    目录 前言 一.RestTemplate是什么? 二.如何使用 1.创建一个bean 2.使用步骤 三.高并发下的RestTemplate使用 1.设置预热功能 2.合理设置maxtotal数量 总结 前言 如果java项目里有调用第三方的http接口,我们可以使用RestTemplate去远程访问.也支持配置连接超时和响应超时,还可以配置各种长连接策略,也可以支持长连接预热,在高并发下,合理的配置使用能够有效提高第三方接口响应时间. 一.RestTemplate是什么? RestTemplat

  • 高并发下restTemplate的错误分析方式

    目录 高并发下restTemplate的错误分析 1. 问题现象和分析 2. 问题解决 使用restTemplate出现的异常 高并发下restTemplate的错误分析 1. 问题现象和分析 org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection 此问题很明显是连接等待超时,而且是从连接池中获取的连接. 那么就有一个很诧异的问题,这里哪来的连接池呢?然后我去跟踪restTemplat

  • 从架构思维角度分析高并发下幂等性解决方案

    目录 1 背景 2 幂等性概念 3 幂等性问题的常见解决方案 3.1 查询操作和删除操作 3.2 使用唯一索引 或者唯一组合索引 3.3 token机制 3.4 悲观锁 3.5 乐观锁 3.6 分布式锁 3.7  select + insert 3.8 状态机幂等 3.9 保证Api接口的幂等性 4 会议室的解决方案 5 总结 1 背景 我们的云办公系统有一个会议预定模块,每个月最后一个工作日的下午三点,会启动对下个月会议室的可用预定. 公司的 会议室大约200个,但是需求量远不止于此,所以会形

  • php结合redis高并发下发帖、发微博的实现方法

    发帖.发微博.点赞.评论等这些操作很频繁的动作如果并发量小,直接入库是最简单的 但是并发量一大,数据库肯定扛不住,这时可采取延迟发布:先将发布动作保存在队列里,后台进程循环获取再入库 模拟发布微博先进入redis队列 weibo_redis.php <?php //此处需要安装phpredis扩展 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth("php001"); //连接

  • php结合redis实现高并发下的抢购、秒杀功能的实例

    抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis. 重点在于第二个问题 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否大于0处,如果在高并发下就会有问题,导致库存量出现负数 <?php $conn=mysql_connect("localho

  • SpringBoot和Swagger结合提高API开发效率

    现在Web开发越来越倾向于前后端分离,前端使用AngularJS,React,Vue等,部署在NodeJS上,后面采用SpringBoot发布Rest服务,前后端进行分离.这样的架构灵活且特别适合大型团队的协作开发. 那么问题来了,因为前端都是和后端通过API进行交互的,那么前后端的Rest API的接口如何进行定义和沟通呢?首先想到的应该就是Swagger. 那么什么是Swagger,Swagger™的目标是为REST APIs 定义一个标准的,与语言无关的接口,使人和计算机在看不到源码或者看

  • PHP+Redis 消息队列 实现高并发下注册人数统计的实例

    前言 现在越来越多的网站开始注重统计和用户行为分析,作为网站经常使用的功能,如何让统计性能更加高,这也是我们需要考虑的事情.本篇通过Redis来优化统计功能(以注册人数统计为例). 传统的统计功能都是直接操作数据库把数据插入表中.这样做,对数据库的性能消耗就会比较大. 思路: 这里我们用到了redis的队列,注册的时候先添加到队列,然后在处理的时候出队,并且把人数添加redis里. 代码: <?php //register.php $redis = new Redis(); $redis->c

随机推荐