COS端到端质量系列——终端COS SDK网络优化

导语

COS SDK 提供了一系列网络优化功能,包括 DNS 解析优化、网络线路加速、弱网优化以及自定义网络层功能。 如果您对上传、下载等 COS 操作的成功率、延迟较为敏感,则可以使用本文档提供的方案进行 COS 访问的网络优化。

背景说明

在移动应用开发中,网络优化对于用户体验至关重要,因为移动网络固有的弱网问题、DNS问题、连接性能等等都相较于固定网络更为严重,因此,优化移动端网络,显的尤其重要。

方案概述

优化方案

方案一:DNS 解析优化

问题说明:

COS SDK 默认使用的是 LocalDNS,DNS 解析过程中可能会遇到解析异常、域名劫持、跨网访问等问题,导致上传下载等 COS 操作缓慢甚至失败。

解析异常:导致无法连接服务器,请求失败。

域名劫持:访问到非 COS 服务器,导致请求和响应失败。

跨网访问:导致网络请求缓慢、甚至请求超时失败。

优化方案:

1. 前往 移动解析 HTTPDNS 控制台 开通,具体操作请参见 开通移动解析 HTTPDNS。

2. 在移动解析 HTTPDNS 控制台添加对应的 COS 域名 (<BucketName-APPID>.cos.<region>.myqcloud),具体操作请参见 添加域名。

3. 获取 HTTPDNS 配置信息,具体说明请参见 配置信息说明。

4. 请您参考 HTTPDNS SDK 配置 进行 HTTPDNS SDK 的集成和配置。COS SDK 默认自动配置了 SDK 接入业务方式,您在配置 HTTPDNS SDK 过程中无需关注 SDK 接入业务方式。

5. 通过 初始化 COS 服务 获取 CosXmlService,通过 addCustomerDNSFetch 方法接入 HTTPDNS。

移动解析 HTTPDNS 控制台:

开通移动解析 HTTPDNS:

COS 域名:

添加域名:

配置信息说明:

HTTPDNS SDK 配置:

SDK 接入业务方式:.E6.8E.A5.E5.85.A5.E4.B8.9A.E5.8A.A1.E6.96.B9.E5.BC.8F

初始化 COS 服务:.-.E6.B3.A8.E5.86.8C-cos-.E6.9C.8D.E5.8A.A1

代码语言:javascript代码运行次数:0运行复制
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 全球加速功能的请求信息会通过腾讯云内网专线加速传输,不仅能实现请求的就近接入,还可以实现数据上传加速和下载加速。

1. 前往 COS 控制台 开启 COS 全球加速,具体操作请参见 开启 COS 全球加速。

COS 控制台:

开启 COS 全球加速:

2. 通过 COS SDK 中 CosXmlServiceConfig 进行开启 COS 全球加速。

代码语言:javascript代码运行次数:0运行复制
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 全球加速内网加速回源。

1. 前往 EdgeOne 控制台 开通,具体操作请参见 开通 EdgeOne。

EdgeOne 控制台:

开通 EdgeOne:

2. 在 EdgeOne 控制台单击添加站点,输入 COS 域名 (<BucketName-APPID>.cos.<region>.myqcloud),进入站点后进行域名管理添加域名时请选择对象存储源站S3兼容,在源站地址处填入 COS 全球加速域名(<BucketName-APPID>.cos.accelerate.myqcloud)。

COS 域名:

3. 开启 EdgeOne 的智能加速功能,请参见 智能加速。

智能加速:

4. 获取步骤2中的加速域名,该域名后续需要配置到 COS SDK 中。

5. 通过 COS SDK 中 CosXmlServiceConfig 进行加速域名的配置。

代码语言:javascript代码运行次数:0运行复制
String region ="ap-beijing";// 您的存储桶地域
String eoDomain ="exampledomain";// eo 加速域名

CosXmlServiceConfig cosXmlServiceConfig =newCosXmlServiceConfig.Builder()
.setRegion(region)
.setHost(eoDomain)// 配置加速域名
.addNoSignHeaders("Host")// EO 转发请求时 host 会变化,此处需要避免 host 签名
.builder();

CosXmlService cosXmlService =newCosXmlService(context, cosXmlServiceConfig,
        credentialProvider);

方案三:弱网优化

问题说明:

尽管4G 和5G 网络的覆盖范围在不断扩大,但在许多地方,特别是偏远地区和室内环境,用户仍然可能会遇到网络信号弱或不稳定的情况。此外,即使在网络覆盖良好的地方,用户也可能会因为网络拥堵等原因遇到网络性能下降的问题。

在弱网环境下,可能会遇到以下问题:连接慢、数据传输慢、丢包率高、网络波动大,这些问题都会影响上传下载等 COS 操作的成功率和速度。

优化方案:

1. 前往 EdgeOne 控制台 开通,具体操作请参见 开通 EdgeOne。

EdgeOne 控制台:

开通 EdgeOne:

2. 在 EdgeOne 控制台单击添加站点,添加对应的 COS 域名 (<BucketName-APPID>.cos.<region>.myqcloud)。进入站点后进行域名管理 添加域名时请选择对象存储源站

COS 域名:

3. 开启 EdgeOne 的 QUIC 功能,请参见 开启 QUIC。

开启 QUIC:

4. 记录步骤2中的加速域名,该域名后续需要配置到 COS SDK 中。

5. 在 Gradle 文件中添加 QUIC 库依赖。

代码语言:javascript代码运行次数:0运行复制
implementation 'com.qcloud.cos:quic:1.5.45'

6. 通过 COS SDK 中 CosXmlServiceConfig 进行自定义域名开启 QUIC

代码语言:javascript代码运行次数:0运行复制
String region ="ap-beijing";// 您的存储桶地域
String eoDomain ="exampledomain";// 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 中自定义网络层的方式。

这是比较灵活的方式,采用这种方式优化的网络问题、优化效果、成本等均由开发者的自定义网络层决定。

优化方案:

1. 继承 NetworkClient 实现自定义网络 Client,实现网络请求的管理、配置等。

2. 继承 NetworkProxy 实现网络请求代理,实现具体的网络请求。

3. 通过 CosXmlServiceConfig 的 setCustomizeNetworkClient 方法配置 COS SDK。

详情请参考:自定义网络层

自定义网络层:

方案五:SDK 内配置线路和协议的切换

问题说明:

为了提高 SDK 请求的成功率以及节省成本,SDK 提供了线路和协议切换策略的配置方法: 保守策略:先使用 COS 默认线路和默认的 https 协议进行请求,网络失败后自动使用加速线路和 quic 协议进行重试。 激进策略:先使用加速线路和 quic 协议进行请求,网络失败后自动使用 COS 默认线路和默认的 https 协议进行重试。 自定义策略:SDK 提供了配置请求网络线路和协议的方法,可以灵活的在业务层控制请求和切换的逻辑(例如根据网络质量自动切换)。 不配置切换策略,则直接使用方案二和方案三中配置的加速线路和弱网协议进行请求。

优化方案:

通过 COS SDK 中 CosXmlServiceConfig 的 setNetworkSwitchStrategy 方法进行保守和激进策略的配置。

代码语言:javascript代码运行次数:0运行复制
String region ="ap-beijing";// 您的存储桶地域
String eoDomain ="exampledomain";// 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 进行自定义策略的配置。

代码语言:javascript代码运行次数:0运行复制
// 任何CosXmlRequest都支持这种方式,例如上传PutObjectRequest、下载GetObjectRequest、删除DeleteObjectRequest等
// 以下用上传进行示例
PutObjectRequest putRequest =newPutObjectRequest("examplebucket-1250000000","exampleobject.txt","本地文件路径");
String eoDomain ="exampledomain";// 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 上传下载的网络性能和成功率,提高用户体验。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-24,如有侵权请联系 cloudcommunity@tencent 删除域名终端sdk网络优化