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 中做到这一点?
我已经找出了上述问题的确切原因。
TLDR:Dio使用基于套接字的dart:io HttpClient默认值为idleTimeout15 秒。但是这个超时在 lib 中被覆盖为 3 秒,这就是为什么所有延迟超过 3 秒的请求都必须打开另一个套接字连接。这导致每个请求之前的连接等待时间很长。
代码解决方案:
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 类型的条目。请参见下图。
我在每个请求之间添加了 4 秒的延迟,并注意到现在每个请求都有一个连接等待时间,并且套接字连接数(类型 ws)等于请求数,即 13。请参见下图。
经过深入研究,我发现默认情况下,Dio 使用基于套接字的 dart:io HttpClient 来发出所有请求。这意味着上面的套接字连接被 Dio 用于发出请求,并且连接在 3 秒后关闭。
翻阅HttpClient和Dio lib的代码,我发现了一个参数——idleTimeout。它的默认值是 15 秒,但在 Dio 中被覆盖为 3 秒,这就是为什么所有延迟超过 3 秒的请求都必须打开一个新的套接字连接。这导致每个请求之前的连接等待时间很长。