导语
COS SDK 提供了一系列网络优化功能,包括 DNS 解析优化、网络线路加速、弱网优化以及自定义网络层功能。 如果您对上传、下载等 COS 操作的成功率、延迟较为敏感,则可以使用本文档提供的方案进行 COS 访问的网络优化。
背景说明
在移动开发应用中,网络优化对于用户体验至关重要,因为移动网络固有的弱网问题、DNS问题、连接性能等等都相较于固定网络更为严重,因此,优化移动端网络,显的尤其重要。
方案概述
优化方案
方案一:DNS 解析优化
问题说明:
COS SDK 默认使用的是 LocalDNS,DNS 解析过程中可能会遇到解析异常、域名劫持、跨网访问等问题,导致上传下载等 COS 操作缓慢甚至失败。
解析异常:导致无法连接服务器,请求失败。
域名劫持:访问到非 COS 服务器,导致请求和响应失败。
跨网访问:导致网络请求缓慢、甚至请求超时失败。
优化方案:
-
前往移动解析 HTTPDNS 控制台 开通,具体操作请参见 开通移动解析 HTTPDNS。
-
在移动解析 HTTPDNS 控制台添加对应的 COS 域名 (<BucketName-APPID>.cos.<region>.myqcloud.com),具体操作请参见 添加域名。
-
获取 HTTPDNS 配置信息,具体说明请参见 配置信息说明。
-
请您参考 HTTPDNS SDK 配置 进行 HTTPDNS SDK 的集成和配置。COS SDK 默认自动配置了 SDK 接入业务方式,您在配置 HTTPDNS SDK 过程中无需关注 SDK 接入业务方式。
-
通过 初始化 COS 服务 获取 CosXmlService,通过 addCustomerDNSFetch 方法接入 HTTPDNS。
cosXmlService.addCustomerDNSFetch(hostname ->{
String ips =MSDKDnsResolver.getInstance().getAddrByName(hostname);
String[] ipArr = ips.split(";");
if(0== ipArr.length){
returnCollections.emptyList();
}
List<InetAddress> inetAddressList =newArrayList<>(ipArr.length);
for(String ip : ipArr){
if("0".equals(ip)){
continue;
}
try{
InetAddress inetAddress =InetAddress.getByName(ip);
inetAddressList.add(inetAddress);
}catch(UnknownHostException ignored){
}
}
return inetAddressList;
});
方案二:网络线路加速
问题说明:
腾讯云在全球很多地区部署了存储中心,客户可以选择性地启用这些存储中心。但即便如此,还是无法避免一些终端用户与存储中心距离间隔太远,以及部分客户存在跨地区甚至跨海访问的业务场景。长距离的数据访问通常就意味着更长的网络链路和更大的传输时延,而且一旦中间某一个环节出现网络抖动、丢包等问题,就会拉低整条链路的访问速度和成功率。
优化方案:
COS 全球加速
COS 全球加速功能的请求信息会通过腾讯云内网专线加速传输,不仅能实现请求的就近接入,还可以实现数据上传加速和下载加速。
- 前往 COS 控制台 开启 COS 全球加速,具体操作请参见 开启 COS 全球加速。
-
通过 COS SDK 中 CosXmlServiceConfig 进行开启 COS 全球加速。
String region ="ap-beijing";// 您的存储桶地域
CosXmlServiceConfig cosXmlServiceConfig =newCosXmlServiceConfig.Builder()
.setRegion(region)
.setAccelerate(true)// 使用 COS 全球加速域名
.builder();CosXmlService cosXmlService =newCosXmlService(context, cosXmlServiceConfig,
credentialProvider);
EdgeOne + COS 全球加速
该方式结合了 EdgeOne 和 COS 全球加速的优点:EdgeOne 边缘节点覆盖广,COS 全球加速内网加速回源。
-
前往 EdgeOne 控制台 开通,具体操作请参见 开通 EdgeOne。
-
在 EdgeOne 控制台单击添加站点 ,输入 COS 域名 (<BucketName-APPID>.cos.<region>.myqcloud.com),进入站点后进行域名管理 ,添加域名 时请选择对象存储源站 和 S3兼容,在源站地址处填入 COS 全球加速域名(<BucketName-APPID>.cos.accelerate.myqcloud.com)。
-
开启 EdgeOne 的智能加速功能 。
-
获取步骤2中的加速域名,该域名后续需要配置到 COS SDK 中。
-
通过 COS SDK 中 CosXmlServiceConfig 进行加速域名的配置。
String region ="ap-beijing";// 您的存储桶地域
String eoDomain ="exampledomain.com";// eo 加速域名CosXmlServiceConfig cosXmlServiceConfig =newCosXmlServiceConfig.Builder()
.setRegion(region)
.setHost(eoDomain)// 配置加速域名
.addNoSignHeaders("Host")// EO 转发请求时 host 会变化,此处需要避免 host 签名
.builder();CosXmlService cosXmlService =newCosXmlService(context, cosXmlServiceConfig,
credentialProvider);
方案三:弱网优化
问题说明:
尽管4G 和5G 网络的覆盖范围在不断扩大,但在许多地方,特别是偏远地区和室内环境,用户仍然可能会遇到网络信号弱或不稳定的情况。此外,即使在网络覆盖良好的地方,用户也可能会因为网络拥堵等原因遇到网络性能下降的问题。
在弱网环境下,可能会遇到以下问题:连接慢、数据传输慢、丢包率高、网络波动大,这些问题都会影响上传下载等 COS 操作的成功率和速度。
优化方案:
-
前往 EdgeOne 控制台 开通,具体操作请参见 开通 EdgeOne。
-
在 EdgeOne 控制台单击添加站点 ,添加对应的 COS 域名 (<BucketName-APPID>.cos.<region>.myqcloud.com)。进入站点后进行域名管理 , 添加域名 时请选择对象存储源站。
-
开启 EdgeOne 的 QUIC 功能,请参见 开启 QUIC。
-
记录步骤2中的加速域名,该域名后续需要配置到 COS SDK 中。
-
在 Gradle 文件中添加 QUIC 库依赖。
implementation 'com.qcloud.cos:quic:1.5.45'
-
通过 COS SDK 中 CosXmlServiceConfig 进行自定义域名 和开启 QUIC。
String region ="ap-beijing";// 您的存储桶地域
String eoDomain ="exampledomain.com";// eo加速域名CosXmlServiceConfig cosXmlServiceConfig =newCosXmlServiceConfig.Builder()
.setRegion(region)
.setHost(eoDomain)// 配置加速域名
.addNoSignHeaders("Host")// EO转发请求时host会变化,此处需要避免host签名
.enableQuic(true)// 开启 QUIC
.builder();CosXmlService cosXmlService =newCosXmlService(context, cosXmlServiceConfig,
credentialProvider);
方案四:自定义网络层
问题说明:
如果 COS SDK 默认的网络实现不符合您的要求或者您的 APP 本身已经开发了完善的自定义网络库并做了相关的网络优化,则可以使用在 COS SDK 中自定义网络层的方式。
这是比较灵活的方式,采用这种方式优化的网络问题、优化效果、成本等均由开发者的自定义网络层决定。
优化方案:
-
继承 NetworkClient 实现自定义网络 Client,实现网络请求的管理、配置等。
-
继承 NetworkProxy 实现网络请求代理,实现具体的网络请求。
-
通过 CosXmlServiceConfig 的 setCustomizeNetworkClient 方法配置 COS SDK。
方案五:SDK 内配置线路和协议的切换
问题说明:
为了提高 SDK 请求的成功率以及节省成本,SDK 提供了线路和协议切换策略的配置方法:
保守策略:先使用 COS 默认线路和默认的 https 协议进行请求,网络失败后自动使用加速线路和 quic 协议进行重试。
激进策略:先使用加速线路和 quic 协议进行请求,网络失败后自动使用 COS 默认线路和默认的 https 协议进行重试。
自定义策略:SDK 提供了配置请求网络线路和协议的方法,可以灵活的在业务层控制请求和切换的逻辑(例如根据网络质量自动切换)。
不配置切换策略,则直接使用方案二和方案三中配置的加速线路和弱网协议进行请求。
优化方案:
通过 COS SDK 中 CosXmlServiceConfig 的 setNetworkSwitchStrategy 方法进行保守和激进策略的配置。
String region ="ap-beijing";// 您的存储桶地域
String eoDomain ="exampledomain.com";// eo 加速域名
// 激进策略
CosXmlServiceConfig.RequestNetworkStrategy aggressiveStrategy =CosXmlServiceConfig.RequestNetworkStrategy.Aggressive;
// 保守策略
CosXmlServiceConfig.RequestNetworkStrategy conservativeStrategy =CosXmlServiceConfig.RequestNetworkStrategy.Conservative;
CosXmlServiceConfig cosXmlServiceConfig =newCosXmlServiceConfig.Builder()
.setRegion(region)
.setHost(eoDomain)// 配置加速域名
.addNoSignHeaders("Host")// EO 转发请求时 host 会变化,此处需要避免 host 签名
.enableQuic(true)// 开启 QUIC
.setNetworkSwitchStrategy(aggressiveStrategy)// 配置切换策略为激进策略
//.setNetworkSwitchStrategy(conservativeStrategy) // 配置切换策略为保守策略
.builder();
CosXmlService cosXmlService =newCosXmlService(context, cosXmlServiceConfig,
credentialProvider);
通过请求基类 CosXmlRequest 的 setHost 和 setNetworkType 进行自定义策略的配置。
// 任何CosXmlRequest都支持这种方式,例如上传PutObjectRequest、下载GetObjectRequest、删除DeleteObjectRequest等
// 以下用上传进行示例
PutObjectRequest putRequest =newPutObjectRequest("examplebucket-1250000000","exampleobject.txt","本地文件路径");
String eoDomain ="exampledomain.com";// eo 加速域名
// 自定义配置具体的请求网络线路,设置null则走默认的COS域名线路
putRequest.setHost(eoDomain);
// 自定义配置QUIC协议
putRequest.setNetworkType(CosXmlRequest.RequestNetworkType.QUIC);
// 自定义配置默认的HTTPS协议
// putRequest.setNetworkType(CosXmlRequest.RequestNetworkType.OKHTTP);
// 初始化 TransferConfig,这里使用默认配置,如果需要定制,请参考 SDK 接口文档
TransferConfig transferConfig =newTransferConfig.Builder().build();
// 初始化 TransferManager
TransferManager transferManager =newTransferManager(cosXmlService, transferConfig);
COSXMLUploadTask uploadTask = transferManager.upload(putRequest,null);
实践建议
由于开发者业务方向和用户群各不相同,上述各优化方式均有一定的成本,下面对一些常见场景给出实践建议。
以下建议仅供参考,具体实践还需结合自身业务需求和成本预算进行决定。
国内用户:DNS 解析优化
海外用户:DNS 解析优化 + 网络线路加速
弱网环境:弱网优化
结语
通过上述网络优化的各种方式,可以帮助开发者提升移动应用中 COS 上传下载的网络性能和成功率,提高用户体验。