【问题标题】:making multiple http request efficiently有效地发出多个http请求
【发布时间】:2012-09-03 09:10:32
【问题描述】:

我想向以下形式的 Web 服务发出几百万个 http 请求- htp://(一些 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-5 小时!!!
  • 我测量了进行几千个 http 调用所需的时间,并估算了其余的时间
  • 如果可以使用StringBuilder,请不要使用StringBuffer。
  • StringBuilder 比 StringBuffer 快大约 25%

标签: java http


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      有没有一种方法可以更有效地提出这样的请求,并且花费更少的时间?

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-02-27
        • 2011-01-08
        • 1970-01-01
        • 2019-01-21
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        • 2022-07-26
        • 2020-09-11
        相关资源
        最近更新 更多