【问题标题】:Is it normal for a http GET request to take between 1 and 3 seconds when my ping to the host is under 1ms? [closed]当我对主机的 ping 小于 1 毫秒时,http GET 请求需要 1 到 3 秒是否正常? [关闭]
【发布时间】:2018-07-07 05:39:02
【问题描述】:

我正在编写一个 java 应用程序,它在执行 http GET 请求时需要非常高效。

我正在使用 netbeans 配置文件功能,它可以让我测量性能,到目前为止我已经尝试了 2 个库:java 默认库和 okhttp。

我注意到,对于每个请求,从我开始构建 url 并执行连接的点到我收到响应代码的点之间需要 1 到 3 秒。这是不是有点过分了?另外,请注意我的电脑和主机之间的 ping 小于 1 毫秒。 openConnection() / execute() 方法怎么会花这么长时间?它甚至正常吗?我怎样才能让它更快?

这就是我使用 okhttp 的方式。 OkHttpClient 客户端仅在我启动应用程序时创建一次

Request request = new Request.Builder()
                .url(url)
                .build();
        try {
            Response response = client.newCall(request).execute();

            jresp = new JSONObject(response.body().string());

            response.close();            
        } catch (Exception ex) {
            ex.printStackTrace();
        }

这是使用java默认库的版本

try {
            StringBuilder result = new StringBuilder();
            URL url = new URL(buyUrl);

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");

            BufferedReader rd;

            int code = conn.getResponseCode();


            if (code == 200) {
                rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            } else {
                rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
            }

            String line;
            while ((line = rd.readLine()) != null) {
                result.append(line);
            }
            rd.close();

            jresp = new JSONObject(result.toString());

        } catch (Exception ex) {
            ex.printStackTrace();
        }

这两种方法的平均时间如我所说,在 1000 到 3000 毫秒之间

【问题讨论】:

  • 这完全取决于您如何处理请求。请发布您的代码。
  • 这也取决于服务器需要做什么来产生响应。如果服务器很慢,你真的什么都做不了。
  • 我建议使用像 Curl 和/或 WireShark 这样的工具来跟踪请求。如果这是服务器端问题,您无能为力。您可以有一个快速的 ping 时间,但服务器可能正在执行一个缓慢的查询。我已经看到服务器需要几分钟来响应获取请求!您还可以在代码中添加一些带有时间戳的日志记录,以准确查看花费了这么长时间。
  • 有很多不同的可能性和原因,以至于这个网站太宽泛了。
  • 原帖中添加的代码

标签: java http netbeans okhttp


【解决方案1】:

使用OkHttp EventListener 或使用 Zipkin 之类的库实现跟踪,以了解为什么在所有级别都需要时间。

如果无法访问您的网络或服务器,我无法回答您的具体情况。

这是对 http://news.google.com 的 OkHttp 请求示例

速度慢的原因

你可以做些什么来加快这个特定的请求

  • 知道第一次到达最终端点
  • 重用现有的 HTTP/2 连接

【讨论】:

  • 我试过了,但是当我点击 Find traces 时,它什么也没显示。
  • 这只是一个例子,如果你想使用 Zipkin 你需要实现你自己的 Tracing 例如github.com/yschimke/oksocial/blob/master/src/main/kotlin/com/…
  • 打印出事件可能更简单,例如github.com/square/okhttp/wiki/Events
  • EventListener 非常有用且易于使用。第一个连接比其他连接花费更多,因为有握手。其他的仍然需要至少一秒钟,但那是因为服务器需要一些时间来发送响应正文(即使它相对较小)。 connectionAcquired 和 requestHeaders 回调在几毫秒内执行,所以我的问题解决了。非常感谢您的帮助。
  • 最后一件事,如果在一定时间内(比如 5 分钟)没有请求,则发出的第一个请求大约需要 100 毫秒才能获得连接。如果在这个请求之后很快有另一个请求,一切都会恢复“正常”,并在 2-3 毫秒内获得连接。如何确保始终在 3 毫秒内建立连接?即使不是为了维持连接,我也应该做中间请求吗?
猜你喜欢
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2019-01-19
  • 1970-01-01
相关资源
最近更新 更多