我正在开发一个在特定URL上执行大量HTTP-Post请求的应用程序。数据通过JSON文件包含在请求中。执行单个POST请求大约需要200毫秒,直到我收到响应代码。为了并行化这些请求,我开始使用不同的工作线程,打开每个HTTPURLConnection并通过此连接发布它们的请求。 不幸的是,我没有看到太多改进,所以我想澄清TCP套接字的基本情况,并从你们那里得到一些想法。
我的每个工作人员都执行请求,如下例所示。
public void submitRequest() {
URL url = new URL("https://example.com");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Accept", "application/json");
conn.setDoOutput(true);
conn.setRequestMethod("POST");
DataOutputStream output = new DataOutputStream(conn.getOutputStream());
// Construct the POST data.
String content = generatedJSONString();
// Send the request data
output.writeBytes(content);
output.flush();
output.close();
// Check response code here
int response = conn.getResponseCode();
}
因为每个工作者都使用自己的HttpsURLConnection,我假设每个工作者只进行一次必要的TLS握手,然后可以执行请求而无需额外的握手?我希望每个工作者都使用自己的TCP连接到服务器。我试着和Wireshark一起检查,但它没有告诉我TLS握手,我真的不知道为什么。
即使并行使用50名工作人员,我的代码执行速度也不够快,无法将相关数据发布到网址。因此我问自己这个问题是否因为TCP连接没有被代码饱和,因为与TCP / HTTP开销相比,JSON数据(通常是10个键值对)对于少量数据。如果不是,我可能会要求服务提供商考虑以批处理方式提供数据的更好方法,以便为每个POST请求提交更多JSON数据。我也改为使用Apache HTTPClient的代码,但我得到了类似的性能,因此我认为我认为TLS连接建立和重用的方式存在错误。