减少 Flutter 中 API 的连接等待时间

Ash*_*ngh 5 https caching flutter dio

我正在尝试优化 Flutter 应用程序的 API 响应时间。我有一个 API,其中添加了服务器级缓存,并且我正在使用Dio来满足我的 API 需求。

在 Postman 上测试时的响应时间约为 100 毫秒。在 Chrome 开发者工具上获取类似的指标。

问题是,当我在 Flutter DevTools 上测量响应时间时,所有响应都 >250 毫秒。经过检查,我发现每个请求的连接等待时间约为 200 毫秒。

邮递员要求无需等待时间

在开发工具上看到连接等待时间较长

如何减少Flutter的上述等待时间?

我尝试切换库并重用此处和http文档中建议的相同 https 客户端,但后续请求的等待时间仍然相似。

var client = http.Client();
final res = await client.get(...);
Run Code Online (Sandbox Code Playgroud)

如何避免这些连接延迟并获得最佳性能?如果缓存 SSL、DNS 查找等是解决方案,那么我该如何在 flutter 中做到这一点?

Ash*_*ngh 4

我已经找出了上述问题的确切原因。

TLDR:Dio使用基于套接字的dart:io HttpClient默认值为idleTimeout15 秒。但是这个超时在 lib 中被覆盖为 3 秒,这就是为什么所有延迟超过 3 秒的请求都必须打开另一个套接字连接。这导致每个请求之前的连接等待时间很长。


代码解决方案:

添加包dio_http2_adapter

final dio = Dio()
    ..options.baseUrl = 'https://example.com'
    ..httpClientAdapter = Http2Adapter(
      ConnectionManager(idleTimeout: Duration(seconds: 15)),
    );
Run Code Online (Sandbox Code Playgroud)

我编写了一个 Dart 程序来重复到达端点。我注意到在第一次调用后,所有请求的连接等待时间都小于 1 毫秒。此外,对于我发出的 13 个 GET 请求,只有一个 ws 类型的条目。请参见下图。

请求之间延迟 2 秒,仅使用一个套接字

我在每个请求之间添加了 4 秒的延迟,并注意到现在每个请求都有一个连接等待时间,并且套接字连接数(类型 ws)等于请求数,即 13。请参见下图。

请求之间延迟 4 秒,使用 13 个套接字

经过深入研究,我发现默认情况下,Dio 使用基于套接字的 dart:io HttpClient 来发出所有请求。这意味着上面的套接字连接被 Dio 用于发出请求,并且连接在 3 秒后关闭。

翻阅HttpClient和Dio lib的代码,我发现了一个参数——idleTimeout。它的默认值是 15 秒,但在 Dio 中被覆盖为 3 秒,这就是为什么所有延迟超过 3 秒的请求都必须打开一个新的套接字连接。这导致每个请求之前的连接等待时间很长。