有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java高效地生成多个http请求

我想向表单的web服务发出几百万个http请求- htp://(某些ip)//{id}

我有身份证清单。 简单的计算表明,我的java代码从api获取数据大约需要4-5个小时 代码是

URL getUrl = new URL("http url");
URLConnection conn = getUrl.openConnection();
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sbGet = new StringBuffer();
String getline;
while ((getline = rd.readLine()) != null)
{
    sbGet.append(getline);
}
rd.close();
String getResponse = sbGet.toString();

有没有一种方法可以更有效地提出这样的请求,而所需的时间更少


共 (3) 个答案

  1. # 1 楼答案

    在开始优化代码之前,需要对其进行评测。否则,您可能最终优化了错误的部分。根据您从分析获得的结果,考虑以下选项。

    • 更改协议以允许您批处理请求
    • 并行发出多个请求(使用多个线程或并行执行多个进程;请参阅this article
    • 缓存以前的结果以减少请求数
    • 压缩请求或响应
    • 保持HTTP连接
  2. # 2 楼答案

    Is there a way to more efficiently make such requests which will take less time?

    您可能可以并行运行少量请求,但很可能会使服务器饱和。超过每秒一定数量的请求,吞吐量可能会降低

    要超过这个限制,您需要重新设计服务器和/或服务器的web API。例如:

    • 将web API更改为允许客户端在每个请求中获取多个对象将减少请求开销

    • 压缩可能会有所帮助,但您正在用网络带宽换取CPU时间和/或延迟。如果你有一个快速的端到端网络,那么压缩实际上可能会减慢速度

    • 缓存通常会有所帮助,但在您的用例中可能不会。(每个对象只请求一次…)

    • 使用持久HTTP连接可以避免为每个请求创建新的TCP/IP连接的开销,但我认为HTTPS不能做到这一点。(这是一个遗憾,因为HTTPS连接的建立要昂贵得多。)

  3. # 3 楼答案

    一种方法是使用带有固定线程池的executor服务(大小取决于目标HTTP服务可以处理的数量),并并行地轰炸对该服务的请求。Runnable基本上会执行您在示例代码中概述的步骤,顺便说一句