我们有流媒体应用程序,它基本上在非常紧迫的时间内将数据(视频块)上传到服务器上。我们使用http streaming来做到这一点(通过NSURLSession uploadTaskWithStreamedRequest),而不是websockets/direct connection。 区块大小约为 100Kb-300Kb。而且我们有一个上传问题,很难追溯到根源......欢迎任何建议。
问题:某些文件的上传延迟偶尔会出现峰值。就像 15-20 个文件中的 1 个上传速度是其他文件的两倍。这种情况偶尔发生,没有任何可见的模式。即使在非常好的连接下也会发生这种情况。 当网络条件允许稳定上传时,我们必须摆脱这种峰值 - 因为我们进行视频流,即使是 15-20 个"后期"文件中的 1 个也会让我们的用户在实时播放时"暂停"。
我们能够在理想条件下在本地网络中详细重现这种情况。 1)客户端(上传者):带有IOS12的iPhone XR。 2)客户端通过Wi-Fi通过本地网络上传300Kb大小的单个文件。成功上传后,客户端开始再次上传,因此我们可以测量顺序上传统计信息 3)服务器:节点.js什么都不做 - 只是接收数据和日志计时。 4) 上传代码:
***
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
configuration.allowsCellularAccess = YES;
configuration.HTTPShouldUsePipelining = YES;
configuration.networkServiceType = NSURLNetworkServiceTypeVoice;
***
NSInputStream* inputStream = [[NSInputStream alloc] initWithFileAtPath: pathTo300KbFile ];
[httpManager setTaskNeedNewBodyStreamBlock:^NSInputStream * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionTask * _Nonnull task) {
return inputStream;
}];
***
NSMutableURLRequest *fileRequest = [NSMutableURLRequest requestWithURL:URL
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:100];
[fileRequest setHTTPMethod:@"POST"];
***
NSURLSessionUploadTask* uploadTask = [httpManager uploadTaskWithStreamedRequest:fileRequest progress:... completionHandler:...];
[uploadTask resume];
***
这段代码只是从头开始再次上传,上传任务返回成功(通过回调)
5)测试结果为"正常"。大多数情况下都会发生这种情况,您可以看到本地网络上 300Kb 文件的平均上传时间非常低且稳定 - 大约 0.5 秒
2019-04-18 15:07:44.793512+0300 DVGCore_Example[2016:1384429] VidLib: #191:300kb-s1-7. Success: +0.54
2019-04-18 15:07:46.019874+0300 DVGCore_Example[2016:1384370] VidLib: #192:300kb-s1-8. Success: +0.67
2019-04-18 15:07:46.828315+0300 DVGCore_Example[2016:1383910] VidLib: #193:300kb-s1-9. Success: +0.37
2019-04-18 15:07:48.383446+0300 DVGCore_Example[2016:1383909] VidLib: #194:300kb-s1-10. Success: +0.83
2019-04-18 15:07:48.948218+0300 DVGCore_Example[2016:1384429] VidLib: #195:300kb-s1-1. Success: +0.29
2019-04-18 15:07:50.116136+0300 DVGCore_Example[2016:1383910] VidLib: #196:300kb-s1-2. Success: +0.37
2019-04-18 15:07:51.168454+0300 DVGCore_Example[2016:1384428] VidLib: #197:300kb-s1-3. Success: +0.33
2019-04-18 15:07:52.244631+0300 DVGCore_Example[2016:1384370] VidLib: #198:300kb-s1-4. Success: +0.33
有关平均值(带接收时间)、正常上传的服务器日志示例:https://gist.github.com/IPv6/27dc7a8e4a53b5219e39cce73691c0be
6)但是对于某些上传,上传时间偶尔会出现峰值。长 2-3 倍
2019-04-18 15:16:50.492425+0300 DVGCore_Example[2022:1385864] VidLib: #124:300kb-s1-8. Success: +1.87
2019-04-18 15:22:06.395094+0300 DVGCore_Example[2027:1387221] VidLib: #200:300kb-s1-6. Success: +2.11
2019-04-18 15:23:28.329843+0300 DVGCore_Example[2027:1387610] VidLib: #281:300kb-s1-9. Success: +2.84
此上载的服务器日志示例:https://gist.github.com/IPv6/8d92b3899682c4cf697dbfb64a1b752c
到底部:没有原因(没有网络问题等),似乎IOS应该能够进行流式传输而不会延迟数小时。但这不会发生。
我们在理想的局部环境中看到了这一点,而在"现实世界"中,同样的峰值甚至更加频繁。
问题是 - 如何摆脱它们? 有什么想法吗?
不错的文章,这有助于追踪原因 https://forums.developer.apple.com/thread/45210
在我们的例子中,测试中使用的WiFi路由器在接收流量时出现问题