使用 RestTemplate 时有很多 TIME_WAIT 个连接?
Lot of TIME_WAIT connections while using RestTemplate?
我正在使用 Spring RestTemplate 对我的 RestService 进行 HTTP 调用。我正在使用 spring 框架 3.2.8 版本的 RestTemplate。我无法升级它,因为我们公司有一个 parent POM,我们在其中使用 Spring 框架版本 3.2.8,所以我需要坚持使用它。
假设我有两台机器:
- machineA:这台机器正在 运行ning 我的代码,它使用 RestTemplate 作为我的 HttpClient,我从这台机器对我的 RestService 进行 HTTP 调用,它在另一台机器(machineB)上 运行ning .我将以下代码封装在多线程应用程序中,以便我可以对我的客户端代码进行负载和性能测试。
- machineB:在这台机器上,我正在 运行我的 RestService。
现在我遇到的问题是每当我 运行 在 machineA 上进行负载和性能测试时 - 意思是,我的客户端代码将对 machineB 上的 RestService 运行ning 进行大量 HTTPClient 调用速度很快,因为客户端代码是以多线程方式被调用的。
我总是在 machineA
上看到很多 TIME_WAIT 连接,如下所示:
298 ESTABLISHED
14 LISTEN
2 SYN_SENT
10230 TIME_WAIT
291 ESTABLISHED
14 LISTEN
1 SYN_SENT
17767 TIME_WAIT
285 ESTABLISHED
14 LISTEN
1 SYN_SENT
24055 TIME_WAIT
我不认为我们这里有很多 TIME_WAIT 联系是个好兆头。
问题陈述:-
- 这个高
TIME_WAIT
连接在 machineA 上用简单的语言表示什么?
- RestTemplate 会发生这种情况有什么原因吗?或者这只是我使用 RestTemplate 的方式?如果我在使用 RestTemplate 时做错了什么,那么正确的使用方法是什么?
我在使用 RestTemplate 时需要设置 keep-alive
header 或 Connection:Close
吗?任何 inputs/suggestions 都非常感谢,因为我对这里发生的事情感到困惑。
下面是我如何以简单的方式在我的代码库中使用 RestTemplate(只是为了解释我如何使用 RestTemplate 的整个想法):
public class DataClient implements Client {
private final RestTemplate restTemplate = new RestTemplate();
private ExecutorService executor = Executors.newFixedThreadPool(10);
// for synchronous call
@Override
public String getSyncData(DataKey key) {
String response = null;
Future<String> handler = null;
try {
handler = getAsyncData(key);
response = handler.get(100, TimeUnit.MILLISECONDS); // we have a 100 milliseconds timeout value set
} catch (TimeoutException ex) {
// log an exception
handler.cancel(true);
} catch (Exception ex) {
// log an exception
}
return response;
}
// for asynchronous call
@Override
public Future<String> getAsyncData(DataKey key) {
Future<String> future = null;
try {
Task task = new Task(key, restTemplate);
future = executor.submit(task);
} catch (Exception ex) {
// log an exception
}
return future;
}
}
下面是我的简单任务class
class Task implements Callable<String> {
private final RestTemplate restTemplate;
private final DataKey key;
public Task(DataKey key, RestTemplate restTemplate) {
this.key = key;
this.restTemplate = restTemplate;
}
public String call() throws Exception {
ResponseEntity<String> response = null;
String url = "some_url_created_by_using_key";
// handling all try catch here
response = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
return response.getBody();
}
}
"TIME_WAIT" 是 TCP 连接在关闭(FIN/FIN 接收)后一段可配置的时间内保持的状态。这样,一个连接的可能 "delayed" 数据包不能与重用相同端口的后一个连接混合。
在高流量测试中,有很多是正常的,但在测试完成几分钟后它们应该会消失。
我正在使用 Spring RestTemplate 对我的 RestService 进行 HTTP 调用。我正在使用 spring 框架 3.2.8 版本的 RestTemplate。我无法升级它,因为我们公司有一个 parent POM,我们在其中使用 Spring 框架版本 3.2.8,所以我需要坚持使用它。
假设我有两台机器:
- machineA:这台机器正在 运行ning 我的代码,它使用 RestTemplate 作为我的 HttpClient,我从这台机器对我的 RestService 进行 HTTP 调用,它在另一台机器(machineB)上 运行ning .我将以下代码封装在多线程应用程序中,以便我可以对我的客户端代码进行负载和性能测试。
- machineB:在这台机器上,我正在 运行我的 RestService。
现在我遇到的问题是每当我 运行 在 machineA 上进行负载和性能测试时 - 意思是,我的客户端代码将对 machineB 上的 RestService 运行ning 进行大量 HTTPClient 调用速度很快,因为客户端代码是以多线程方式被调用的。
我总是在 machineA
上看到很多 TIME_WAIT 连接,如下所示:
298 ESTABLISHED
14 LISTEN
2 SYN_SENT
10230 TIME_WAIT
291 ESTABLISHED
14 LISTEN
1 SYN_SENT
17767 TIME_WAIT
285 ESTABLISHED
14 LISTEN
1 SYN_SENT
24055 TIME_WAIT
我不认为我们这里有很多 TIME_WAIT 联系是个好兆头。 问题陈述:-
- 这个高
TIME_WAIT
连接在 machineA 上用简单的语言表示什么? - RestTemplate 会发生这种情况有什么原因吗?或者这只是我使用 RestTemplate 的方式?如果我在使用 RestTemplate 时做错了什么,那么正确的使用方法是什么?
我在使用 RestTemplate 时需要设置 keep-alive
header 或 Connection:Close
吗?任何 inputs/suggestions 都非常感谢,因为我对这里发生的事情感到困惑。
下面是我如何以简单的方式在我的代码库中使用 RestTemplate(只是为了解释我如何使用 RestTemplate 的整个想法):
public class DataClient implements Client {
private final RestTemplate restTemplate = new RestTemplate();
private ExecutorService executor = Executors.newFixedThreadPool(10);
// for synchronous call
@Override
public String getSyncData(DataKey key) {
String response = null;
Future<String> handler = null;
try {
handler = getAsyncData(key);
response = handler.get(100, TimeUnit.MILLISECONDS); // we have a 100 milliseconds timeout value set
} catch (TimeoutException ex) {
// log an exception
handler.cancel(true);
} catch (Exception ex) {
// log an exception
}
return response;
}
// for asynchronous call
@Override
public Future<String> getAsyncData(DataKey key) {
Future<String> future = null;
try {
Task task = new Task(key, restTemplate);
future = executor.submit(task);
} catch (Exception ex) {
// log an exception
}
return future;
}
}
下面是我的简单任务class
class Task implements Callable<String> {
private final RestTemplate restTemplate;
private final DataKey key;
public Task(DataKey key, RestTemplate restTemplate) {
this.key = key;
this.restTemplate = restTemplate;
}
public String call() throws Exception {
ResponseEntity<String> response = null;
String url = "some_url_created_by_using_key";
// handling all try catch here
response = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
return response.getBody();
}
}
"TIME_WAIT" 是 TCP 连接在关闭(FIN/FIN 接收)后一段可配置的时间内保持的状态。这样,一个连接的可能 "delayed" 数据包不能与重用相同端口的后一个连接混合。
在高流量测试中,有很多是正常的,但在测试完成几分钟后它们应该会消失。