HTTPClient带来的性能问题

一、问题描述
最近在给项目做性能测试,高并发情况下,发现系统内存暴涨,而且吞吐量很低,基本只有100tps。

二、问题分析
原设计中每次指令下发,都会创建一个新的httpclient,开销太大。实际httpclient是一个线程安全的类,全局保留一个即可。

三、解决方案
运用单利模式创建HttpAsyncClients,所有并发线程共用一个HttpAsyncClients对象,设置连接池最大连接数500.
贴上初始化HttpAsyncClients代码:

public class ServiceClient
{
    private volatile static CloseableHttpAsyncClient httpclient;

    public static CloseableHttpAsyncClient getInstance() throws IOReactorException
    {
        if (httpclient == null)
            synchronized (DaServiceClient.class)
            {
                if (null == httpclient)
                {
                    ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor();
                    PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor);
                    cm.setMaxTotal(500);
                    httpclient = HttpAsyncClients.custom().setConnectionManager(cm).build();
                    httpclient.start();
                }
            }
        return httpclient;
    }
}

在操作HTTP请求时,直接使用对象httpclient即可。
经过这个优化,2000tps系统也压力很小,内存也不会一直增长。

参考连接:https://www.cnblogs.com/davidwang456/articles/8526964.html

你可能感兴趣的:(HTTPClient带来的性能问题)