行唐县 满城县 龙海市 扎赉特旗 宝应县 麻城市 遂平县 鲁山县 冀州市 潍坊市 岐山县 晋中市 南乐县 浦江县 孙吴县 新巴尔虎左旗

文章导航软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:单机游戏角色扮演 → 怪物猎人世界新装备介绍 怪物猎人世界新装备新系统一览

夜行书生_HttpClient4 TIME_WAIT和CLOSE_WAIT

标签:二室 史小坑斗地主

  最近,公司的接口服务器(客户端,向外发送数据)频繁出现了connecttimeout以及readtimeout的情况,经过运维平台检测,并没有网络延时的情况。于是,开始怀疑连接池出了问题。

  使用linux命令:netstat -n | awk "/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}" 可以清楚的看到tcp各个状态下小爸爸_2018年最新新闻网的连接数。

  

  如图:CLOSE_WAIT数目大的惊人,问题就出在了这里:这个级别的TIME_WAIT是没有问题的, linux的句柄数(https://blog.csdn.net/shootyou/article/details/6579139)有限,大量的CLOSE_WAIT占去了过多的连接数,导致其他连接异常。

  据查:

  tcp连接三次握手,四次挥手。

  

    这其中,我们比较关注的状态有三个:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。

    其中:ESTABLISHED 无需多言,TIME_WAIT 的存在是:

  1. 防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
  2. 可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT 会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。

  

值 得一说的是,对于基于TCP的HTTP协议,关闭TCP连接的是Server端,这样,Server端会进入TIME_WAIT状态,可 想而知,对于访 问量大的Web Server,会存在大量的TIME_WAIT状态,假如server一秒钟接收1000个请求,那么苍天有泪_2018年最新新闻网就会积压 240*1000=240,000个 TIME_WAIT的记录,维护这些状态给Server带来负担。当然现代操作系统都会用快速的查找算法来管理这些 TIME_WAIT,所以对于新的 TCP连接请求,判断是否hit中一个TIME_WAIT不会太费时间,但是有这么多状态要维护总是不好。  
HTTP协议1.1版规定default行为是Keep-Alive,也就是会重用TCP连接传输多个 request/response,一个主要原因就是发现了这个问题。  

    也就是说HTTP的交互跟上面画的那个图是不一样的,关闭连接的不是客户端,而是服务器,所以web服务器也是会出现大量的TIME_WAIT的情况的。这也说清楚了,为什么我的客户端服务器会出现大量CLOSE_WAIT的情况。

    学生借校园贷自杀_2018年最新新闻网然后,我又在windows端实时测试(netstat同样适用),的确,我所使用的HttpClient4在每次接口发送完毕都会产生一个CLOSE_WAIT。这是为什么呢,使用连接池,是为了连接可以复用,而现在的情况确是相反的。

    经查,HttpClient4为了连接复用使用的都是长连接,Response的Header中默认Connection是Keep-alive即连接不会关闭,以便下次请求相同网站的时候进行复用,这是产生CLOSE_WAIT连接的原因所在。所以我猜测HttpClient4故意留住CLOSE_WAIT

复用该连接。不会复用?是不是我的对象创建的有问题?于是改了单例:

    

public class HttpApa男篮欧锦赛_2018年最新新闻网cheClient {

    private static class SingletonHandler{
        private static HttpApacheClient singleton = new HttpApacheClient();
    }

    private HttpApacheClient(){}

    public static HttpApacheClient getInstance(){
        return SingletonHandler.singleton;
    }

    private static Logger logger = LoggerFactory.getLogger(HttpApacheClient.class);



    private final HttpClientConnectionManager manager = builderPoolConnectionManager() ;  //定义连接池管理变量
    ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
        @Override
        public String handleResponse(final HttpResponse response)
                throws ClientProtocolException, IOException {
            int status = response.getStatusLine().getStatusCode();
            if (status &太行山_2018年最新新闻网gt;= 200 && status < 300) {
                HttpEntity entity = response.getEntity();
                if (entity == null) throw new BusinessExc缅因猫_2018年最新新闻网eption(RESULT_LOG_ERROR);
                String content =  EntityUtils.toString(entity);
                logger.info("the log back :"+content);
                JSONObject jsonObject = JSON.parseObject(content);
                Integer returnStatus = (Integer)jsonObject.get("status");
                if (returnStatus !=200) throw new BusinessException(RESULT_LOG_ERROR,content);
                return content;
            } else {
                throw new ClientProtocolException("Unexpected response status: " + status);
            }
        }
    };


    public HttpClientConnectionManager builderPoolConnectionManager(){
        final SSLContext context = SSLContexts.createSystemDefault();
        final HostnameVerifier verifier = new DefaultHostnameVerifier() ;
        //自定义注册器,既可以发送http请求,也可以发送https请求
        final Registry<ConnectionSocketFactory> register = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http" , PlainConnectionSocketFactory.INSTANCE)
                .register("https" , new SSLConnectionSocketFactory(context ,verifier))
                .build() ;
        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(register);
        poolingHttpClientConnectionManager.setMaxTotal(200);  //设置连接池的最大连接数
        poolingHttpClientConnectionManager.setDefaultMaxPerRoute(poolingHttpClientConnectionManager.getMaxTotal());  //一个路由的最大连接数
        return poolingHttpClientConnectionManager ;
    }

    public HttpClient buildHttpClient(){
        RequestConfig config = RequestConfig.custom()
                .setConnectionRequestTimeout(3000)  //从池中获取请求的时间
                .setConnectTimeout(2000)   //连接到服务器的时间
                .setSocketTimeout(5000).build(); //读取信息时间

        CloseableHttpClient build = HttpClients.custom()
                .setRetryHandler(DefaultHttpRequestRetryHandler.INSTANCE)
                .setDefaultRequestConfig(config)
                .setConnectionManagerShared(true)
                .setConnectionManager(manager)
                .build();
        return build ;
    }

    public static String postJson(String url, List<NameValuePair> params) throws Exception {
        String urlHead = (String) BeanHelper.getConfig("url");
        url = urlHead+url;
        logger.info("url "+url+";"+params);
        HttpApacheClient utils = getInstance();
        HttpClient httpClient = null;
        HttpPost httpPost = null;
        try {
            httpClient = utils.buildHttpClient();
            httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));
            httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
            return httpClient.execute(httpPost, utils.responseHandler);
        }catch (Exception e){
            if (httpPost!=null) httpPost.abort();//异常时 关闭连接
            throw  e;
        }
    }

    }
}

  问题得以解决。

  水比较深,未完待续。

当前文章:http://5x76ikj-juhoutai-com.piaotax.cn/7mvg/4ffa1_151380.html

发布时间:2019-07-20 14:38:48

澳门银河手机网站  澳门银河官网手机app  澳门银河手机网站福建霞浦渔船失事致1人失联  澳门银河yh99.com  澳门银河有正规平台吗  银河娱乐是正规网站吗  澳门银河2949所有网址华安保险董事长李光荣因涉嫌行贿罪被捕:“精通资本运营”  银河国际手机网址2949俄罗斯红场5月4日至9日将关闭参观  澳门银河官网手机app  919银河优越会  

相关阅读 孔桥减震/四季畅跑,李宁男士驭弧科技缓震跑鞋139元(40元券)谷歌增强现实平台ARCore终于进入中国市场中国大陆GRE考生愈加青睐商科和物理科学相关专业年度盘点丨腾讯家居张永志:2017中国家居产业十大关键词《飙酷车神2》试玩:海陆空一体的游戏你见过没?轻质减震/柔软弹力,卡帝乐鳄鱼男士网面透气休闲鞋58元(60元券)mtools-你可能没用过的mongodb神器小米应用商店上架ARCore App,小米8/MIX 2S抢先体验

文章评论
发表评论

热门文章 直降260元/价保30天,Beats X蓝牙无线运动耳机798元秒杀史上最强!美图T9手机新增微软AI语音控制拍照技术三亚落实两区划定暨耕地地力保护补贴工作周林:构筑国际化商科教育新高地

最新文章 “很吓人的”荣耀Play价格疑似线下曝光:3299元意大利政党达成共识 推举54岁法学教授为总理人选 育碧:新《阿凡达》游戏将于2020年之后发售让家长寓教于乐:“6.1”儿童节二合一笔记本推荐史上最逼真空战游戏《僚机》曝光:虚幻4打造免费体验知中国、看世界,“新成长计划”启动仪式在京举行

人气排行 欧盟还有隐私新法案待实施,引美国互联网巨头担忧?? ??? ?? ???[??] ?? ??? ????!金家胜:京西矿山“补山匠”前端也要学系列:设计模式之装饰者模式教育部发高校科研工作汇编:清华经费破50亿元,17所高校超20亿陕西宁陕官方就“副局长投毒案”发说明:证据不能认定其涉嫌犯罪腾讯起诉今日头条系,索赔1元并要求道歉