有效地发出多个http请求

时间:2012-09-03 09:10:33

标签: java http

我想向表格的网络服务提出几百万个http请求 - htp://(某些ip)// {id}

我有ids列表。 简单的计算表明,我的java代码大约需要4-5个小时才能从api获取数据 代码是

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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

  

有没有办法更有效地提出这样的请求,这会花费更少的时间?

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

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

  • 更改Web API以允许客户端在每个请求中获取大量对象将减少请求开销。

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

  • 缓存一般有帮助,但可能不在您的用例中。 (您只需要一次请求每个对象......)

  • 使用持久性HTTP连接可以避免为每个请求创建新的TCP / IP连接的开销,但我认为您不能为HTTPS执行此操作。 (这是一种耻辱,因为HTTPS连接建立要贵得多。)