【问题标题】:How to get the time it took to connect on a request basis using Jetty Client如何使用 Jetty 客户端获取基于请求的连接时间
【发布时间】:2021-06-10 23:01:30
【问题描述】:

我想计算每个请求从请求开始到建立连接(TCP 连接建立)之间的时间。

我问了这个问题question,但它是模棱两可的。

我看过建议的答案,也许我误解了,但我知道 Connection.Listener 至少在全球范围内工作(总连接时间)

所以我尝试了基于SocketAddressResolver的方法:

    private static class CustomSocketAddressResolver implements SocketAddressResolver {
        private StopWatch stopWatch = new StopWatch();
        
        private SocketAddressResolver adaptee;
        
        public CustomSocketAddressResolver(SocketAddressResolver adaptee) {
            this.adaptee = adaptee;
        }
        
        public long getConnectTime() {
            return stopWatch.getTime();
        }


        @Override
        public void resolve(String host, int port, Promise<List<InetSocketAddress>> promise) {
            stopWatch.reset();
            stopWatch.start();          
            adaptee.resolve(host, port, new Promise<List<InetSocketAddress>>() {

                @Override
                public void succeeded(List<InetSocketAddress> result) {
                    // Add as first address an invalid address so that we test
                    // that the connect operation iterates over the addresses.
                    stopWatch.stop();
                    promise.succeeded(result);
                }

                @Override
                public void failed(Throwable x) {
                    stopWatch.stop();
                    promise.failed(x);
                }
            });
        }
    }

然后我可以像这样获得连接时间:

 ((CustomSocketAddressResolver) httpClient.getSocketAddressResolver()).getConnectTime()

它有效,但有更好的方法吗?

【问题讨论】:

  • 如果时间少于 1 毫秒,或者时钟精度小于连接时间怎么办? [回到 Windows XP 时代,如果你有 50-100 毫秒的精度,那你就很幸运了]。
  • 您好,在这种情况下您有什么建议?
  • 那么小有问题吗?您是否在优化不需要优化的东西(见答案)。

标签: java http jetty http2 jetty-9


【解决方案1】:

我想计算每个请求从请求开始到建立连接(TCP 连接建立)之间的时间。

这里可能有误会。

HTTP/1.1 和 HTTP/2 使用持久 TCP 连接。 一个 TCP 连接被创建,保持打开状态,并被许多请求重用。

例如,创建一个 TCP 连接,然后将其重新用于例如 1067 个请求,然后仍然保持打开状态。

计算从第 1067 个请求开始到首次建立连接之间的时间没有多大意义(或者我很想听听一个用例)。

我知道连接保持打开数天的情况。

【讨论】:

  • 您好,这是为了进行性能测试。是的,我知道您所描述的内容,并且当为同一虚拟用户打开连接时发出的请求的连接时间将为 0。我的代码是否符合我描述的目的?有没有更好/更简单的方法?非常感谢您的帮助。
  • 通常测量连接时间与大多数对请求时间感兴趣的基准无关。只需测量响应时间,例如:github.com/jetty-project/jetty-load-generator
  • 好的,谢谢指点。所描述的方法是否仍然有效(根据您的其他答案?)?
  • 您问题中代码 sn-p 中的方法不是线程安全的。
  • 确实,我认为同步 StopWatch 访问还不够正确,因为可能会为 1 个线程运行 resolve 调用,而为另一个线程调用 CustomSocketAddressResolver#getConnectTime。每个请求是否有某种上下文我可以用来在每次调用时存储这些信息?
猜你喜欢
  • 2021-06-10
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多