1.背景
A系统采集一批物联网设备上报的数据,这个时候有个第三方系统B系统也需要物联网的数据,B系统提供了一个接口供A系统调用推送,在代码中采用http方式进行推送。
2.问题
如果A系统创建了一个Http线程池,供调用接口推送数据时使用,假设这一批物联网设备每秒80个请求,connectTimeout设置为3秒,readTimeout也设置为3秒,此时会有2种情形
- B系统挂掉了,那么A系统发送http请求时,等待3秒后会抛出 java.net.SocketTimeoutException: connect timed out,等到第4秒时才会释放第一批占用的连接资源,也就是会有240个连接一直不能释放
- 假设B系统接口响应为5秒,那么A系统发送http请求时(假设连接时间忽略),同上面一样也会有240个连接一直不能释放
- 极端情况下,B系统因为自身问题,A系统发送http请求时,连接时间需要2秒,响应时间为5秒,那么这种请求下,需要5秒才能释放一个连接资源,总共可能就有350个连接资源一直被占用
上面的几点都很可能会把A系统给拖挂。
3.使用注意
针对2的问题,可以根据自身的业务场景对connectTimeout和readTimeout分别设置调优。
如果推送数据给对方,并且不关注对方的接口响应,connectTimeout和readTimeout可以根据自己的系统来适当调小,当然如果readTimeout过小,可能会抛java.net.SocketTimeoutException: Read timed out异常,但是实测对方系统是能接收到你推送的数据的。所以这种情况可能需要自己去做一些处理