在测试环境发现了一个问题,每次服务器重启后,所有对新浪微博的请求都可以正常的发出,但从第9请求开始,请求耗时将变为40s左右。
问题要从9和40s这两个关键词开始,httpclient的代码如下:


ProtocolSocketFactory protocolSocketFactory = new EasySSLProtocolSocketFactory();
Protocol.registerProtocol("https", new Protocol("https", protocolSocketFactory, 443));
client.getHttpConnectionManager().getParams().setDefaultMaxConnectionsPerHost(8);
client.getHttpConnectionManager().getParams().setMaxTotalConnections(100);
client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
client.getHttpConnectionManager().getParams().setSoTimeout(5000);
client.getHttpConnectionManager().getParams().setTcpNoDelay(true);
client.getHttpConnectionManager().getParams().setLinger(40000);
client.getHttpConnectionManager().getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
client.getHttpConnectionManager().getParams().setStaleCheckingEnabled(true);

可以看到我们设置了setDefaultMaxConnectionsPerHost为8,setLinger为40000,经过查询资料推测原因如下:

首先我们先要澄清几个概念
1、对于tcp请求来说,tcp的客户端服务端概念和http的不同,请求双方,哪边关闭请求,哪边就是tcp客户端,另一边就为服务端。
2、tcp的一个链接由4个值确定,源ip、源端口、目标ip、目标地址。

tcp状态图中有一个TIME_WAIT状态,也叫2MSL状态,该状态是为了保证在tcp客户端发给tcp服务端最后一个ACK能顺利到达的一个等待状态。若没有TIME_WAIT状态,tcp客户端将直接进入CLOSED 状态,但有时由于网络原因,ACK 响应丢失,tcp服务端收不到 ACK,将重发FIN,CLOSED 状态的tcp客户端将返回RST ,而不是ACK。将导致tcp服务器异常。

也就是为了这个原因,tcp的客户端将会把连接保留在2MSL状态一段较长的时间。在这段时间里等待重发的FIN。这里需要注意的是,在2MSL状态的连接是不可以被重新使用。

我们上面的代码设置了对单个站点只能有最大的连接8个,对于httpclient的应用,这8个连接只有8个端口,同一个ip。若在2MSL的时间里,8个请求都被耗尽,那么第9个请求就必须等待2MSL状态结束。

而新浪服务器估计是由于轮询的原因,会尽可能的保持着连接,所以接收到所有数据的httpclient应用,会发起关闭连接,此时就进入了2MSL的状态。

解决方案也很简单,增加连接数 setDefaultMaxConnectionsPerHost ,或减少2MSL状态(TIME_WAIT)setLinger 的时间。

已有 0 人发表留言,猛击->>这里<<-参与讨论

ITeye推荐

  • —软件人才免语言低担保 赴美带薪读研!—

转载于:https://www.cnblogs.com/dongsm/archive/2013/02/14/3108803.html

新浪微博开放平台链接耗尽的情况分析相关推荐

  1. 新浪微博开放平台深度历险

    作者:蒋宇捷(hfahe) 版权声明:原创作品,欢迎转载,转载时请务必以超链接形式标明文章原始出处 .作者信息和本声明. 10月21日补充 解决Ajax跨域的方法 可通过新浪提供的JS SDK解决,详 ...

  2. 阿里浪时代,新浪微博开放平台何去何从?

    阿里投资新浪微博,普遍视为双赢局面.但满天飞的分析文章里,始终缺少从微博开放平台角度做的点评. 新浪微博一直给开放平台很高地位.去年 12 月架构调整,开放平台地位不降反升,成为独立部门,由副总褚达晨 ...

  3. PHP+新浪微博开放平台+新浪云平台(SAE)开发微博应用——建立微博应用的过程

    PHP+新浪微博开放平台+新浪云平台(SAE) --新浪微博应用开发的一个解决方案 一.PHP+新浪微博开放平台+新浪云平台(SAE)方案的基础 二.建立微博应用的过程 三.PHP SDK中Demo程 ...

  4. PHP+新浪微博开放平台+新浪云平台(SAE)开发微博应用——PHP SDK中Demo程序简析

    PHP+新浪微博开放平台+新浪云平台(SAE) --新浪微博应用开发的一个解决方案 一.PHP+新浪微博开放平台+新浪云平台(SAE)方案的基础 二.建立微博应用的过程 三.PHP SDK中Demo程 ...

  5. Oauth2认证以及新浪微博开放平台应用

    一.OAuth2.0概述 大部分API的访问如发表微博.获取私信,关注都需要用户身份,目前新浪微博开放平台用户身份鉴权有OAuth2.0和Basic Auth(仅用于应用所属开发者调试接口),新版接口 ...

  6. 新浪微博开放平台开发-android客户端(2)

    引言 最近不是太忙,花了一些时间学习android的应用开发.经过两个星期的学习,学习的同时还写了很多的demo示例,可以从基本控件及基本动画效果等示例demo集合大放送,持续更新下载. 从这个星期开 ...

  7. c#调用新浪微博开放平台接口

    在这篇文章中,我们将和大家分享如何通过.NET(C#)调用新浪微博开放平台接口. 使用新浪微博开放平台接口,需要先申请一帐号,申请方法:给@微博开放平台发送私信,或者给open_sina_mblog@ ...

  8. iOS学习之iOS5.0以上 使用新浪微博开放平台OAuth

    新浪微博开放平台为第三方应用提供了简便的合作模式,满足了手机用户和平板电脑用户随时随地分享信息的需求.通过调用平台的api即可实现很多微博上的功能. 本篇主要目的是记录新浪微博移动SDK iOS版本的 ...

  9. PHP+新浪微博开放平台+新浪云平台(SAE)开发微博应用——必须交待的几个问题

    PHP+新浪微博开放平台+新浪云平台(SAE) --新浪微博应用开发的一个解决方案 一.PHP+新浪微博开放平台+新浪云平台(SAE)方案的基础 二.建立微博应用的过程 三.PHP SDK中Demo程 ...

  10. 新浪微博开放平台API中page参数的使用方法

    新浪微博开放平台API中page参数的使用方法 在做项目的时候,有时候要调用新浪微博开放平台的API.说实话,新浪微博的API功能很强大,但是API文档写的不是很清楚. 我在做项目的时候,调用了很多A ...

最新文章

  1. 红盟idc技术培训群—安全培训(三)
  2. SecondarySort 原理
  3. oracle12c双机热备方案,Oracle 共享磁盘阵列 双机热备 实战 配置教程 配置手册
  4. 5个常用的Python功能代码
  5. Java Map集合
  6. c#中overlord实例_具有Overlord的WildFly 8.1中的API管理
  7. caffe调用的一个例子
  8. ABP文档 - Javascript Api - AJAX
  9. 伪类如何动态在html设置样式,用js实现before和after伪类的样式修改的示例代码
  10. 吴恩达深度学习5.2练习_Sequence Models_Emojify
  11. 34-指针与二维数组
  12. 扫地机器人滤网顺序_扫地机器人如何维护 扫地机器人维护技巧【介绍】
  13. 防止刷新重复post提交
  14. 微信公众平台开发(41)一键关注微信公众平台账号
  15. 24个可能你现在用不到,但应该了解的 PHP 库
  16. 暑期训练第四次团队赛
  17. Visual Studio 2008 简体中文正式版下载及序列号(无使用期限限制,正式版)
  18. linux 设置深信服easyconnect 代理
  19. C++写一个CSGO开箱模拟器
  20. 使用Python爬取网页图片

热门文章

  1. bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)
  2. 【9933】单词的划分
  3. UIScrollView 和 UICollectionView 分页效果
  4. 【算法】如何将一个文件分割成多份(C,Java语言实现)
  5. Length of Last Word
  6. Cache-control
  7. 《无码的青春》第七章 御姐
  8. Asp.Net学习之-母板
  9. 【Window】使用技巧
  10. 敏捷个人学习----为什么的力量