3

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

我有身份证清单。简单计算表明,我的 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();

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

4

3 回答 3

1

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

于 2012-09-03T09:16:24.090 回答
0

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

  • 更改协议以允许您对请求进行批处理
  • 并行发出多个请求(使用多个线程或并行执行多个进程;请参阅本文
  • 缓存以前的结果以减少请求的数量
  • 压缩请求或响应
  • 保持 HTTP 连接
于 2012-09-03T09:20:17.093 回答
0

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

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

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

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

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

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

  • 使用持久 HTTP 连接可以避免为每个请求创建新的 TCP/IP 连接的开销,但我认为您不能为 HTTPS 执行此操作。(这很遗憾,因为建立 HTTPS 连接的成本要高得多。)

于 2012-09-03T09:22:58.260 回答