海量数据大课学习笔记(10)-架构核心技术-池化思想-异步结合 性能优化最佳实践《下》-小滴课堂

发布于:2023-01-24 ⋅ 阅读:(22) ⋅ 点赞:(0) ⋅ 评论:(0)


前言

小滴课堂,旨在让编程不在难学,让技术与生活更加有趣。 随着互联网+的时代,在线教育技术越来越便捷,小滴课堂依托在线教育时间以及空间上的便利,为广大IT从业者提供了更为方便、快捷的学习交流途径、提供大量高质量的IT在线课程。更多教程请访问xdclass.net(添加VX:xdclass99)

第1集 RestTemplate里面的存在的问题你知道多少- Broken pipe错误

简介: RestTemplate里面的存在的问题你知道多少

  • 还原代码(暂时不用异步)

    • 异步-里面是用线程池-是池化思想的一种应用
  • 同步发送+resttemplate未池化

    • 压测结果 几百吞吐量

    • 错误Caused by: java.io.IOException: Broken pipe

      • 服务端向前端socket连接管道写返回数据时 链接(pipe)却断开了
        • 从应用角度分析,这是因为客户端等待返回超时了,主动断开了与服务端链接
        • 连接数设置太小,并发量增加后,造成大量请求排队等待
        • 网络延迟,是否有丢包
        • 内存是否足够多支持对应的并发量

在这里插入图片描述

  • 问题分析

    • resttemplate底层是怎样的?
    • 基于之前的认知-池化思想,联想到是否使用了http连接池?
  • 重新认识RestTemplate

    • RestTemplate是Spring提供的用于访问Rest服务的客户端
    • 底层通过使用java.net包下的实现创建HTTP 请求
    • 通过使用ClientHttpRequestFactory指定不同的HTTP请求方式,主要提供了两种实现方式
      • SimpleClientHttpRequestFactory(默认)
        • 底层使用J2SE提供的方式,既java.net包提供的方式,创建底层的Http请求连接
        • 主要createRequest 方法( 断点调试),每次都会创建一个新的连接,每次都创建连接会造成极大的资源浪费,而且若连接不能及时释放,会因为无法建立新的连接导致后面的请求阻塞
      • HttpComponentsClientHttpRequestFactory
        • 底层使用HttpClient访问远程的Http服务
  • 问题解决

    • 客户端每次请求都要和服务端建立新的连接,即三次握手将会非常耗时
    • 通过http连接池可以减少连接建立与释放的时间,提升http请求的性能
    • Spring的restTemplate是对httpclient进行了封装, 而httpclient是支持池化机制
    • 拓展
      • 对httpclient进行封装的有:Apache的Fluent、es的restHighLevelClient、spring的restTemplate等

第2集 高性能RestTemplate连接池封装配置实战

简介: 高性能RestTemplate封装配置实战

  • 配置RestTemplate连接池实战
  @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }

    @Bean
    public ClientHttpRequestFactory httpRequestFactory() {
        return new HttpComponentsClientHttpRequestFactory(httpClient());
    }


    /**
     * @return
     */
    @Bean
    public HttpClient httpClient() {
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);

        //设置整个连接池最大连接数
        connectionManager.setMaxTotal(500);

        //MaxPerRoute路由是对maxTotal的细分,每个主机的并发,这里route指的是域名
        connectionManager.setDefaultMaxPerRoute(200);
        RequestConfig requestConfig = RequestConfig.custom()
                //返回数据的超时时间
                .setSocketTimeout(20000)
                //连接上服务器的超时时间
                .setConnectTimeout(10000)

                //从连接池中获取连接的超时时间
                .setConnectionRequestTimeout(1000)
                .build();

        return HttpClientBuilder.create()
                .setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connectionManager)
                .build();
    }

第3集 【10倍+QPS提升】Jmeter5.x压测 优化后RestTemplate前后性能对比

简介: 【10倍+提升】Jmeter5.x压测 优化后RestTemplate前后性能对比

  • 同步发送+resttemplate未池化

    • 压测结果 几百 吞吐量
  • 同步发送+resttemplate池化

    • 压测结果

在这里插入图片描述

  • 检查你自己公司的项目,是否存在对应的问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFSKr3pd-1660015471375)(img/image-20211115110712980.png)]

  • 这些都是面试跳槽里面-项目的亮点
    • 发现问题
    • 找出原因
    • 解决问题