HarmonyOS —— Remote Communication Kit 基于 Configuration 的传输性能优化笔记
HarmonyOS —— Remote Communication Kit 基于 Configuration 的传输性能优化笔记
前面那一堆 DNS / 安全 / Tracing / 流式 / 拦截器,其实都靠一个入口串起来:
Configuration+SessionConfiguration。
这一篇就当成:我怎么用「一套配置」,把 HTTP 请求从 预处理 → DNS → 建连 → 请求 → 响应 整条链都调优一遍。
一、能力概览 & 设备支持
通过配置 Configuration 优化传输性能,本质是:
用
SessionConfiguration+Configuration把「网络行为」控制好,
再结合 DNS / 连接池 / 分段上传下载 / 时间统计,
让同一套 HTTP 能在不同网络环境下有最优表现。
支持设备:
- Phone / 2in1 / Tablet / Wearable
- 从 5.1.1(19) 起新增 TV 支持
一句背:通过配置 Configuration 优化传输性能能力支持 Phone / 2in1 / Tablet / Wearable,5.1.1(19) 起新增 TV 支持。
二、请求预处理阶段:用好 Session 抽象
Remote Communication Kit 基于 Session 抽象 搭了一个高并发网络框架:
- ✅ 支持创建多个
Session - ✅ 支持请求动态取消(
session.cancel(request)) - ✅ 支持关闭 Session(
session.close()) - ✅ Session 之间资源独立、互不影响
也就是说:
一类业务一套 Session,既能隔离配置,又能方便统一收尾。
const session1 = rcp.createSession({
requestConfiguration: {
transfer: {
timeout: {
connectMs: 5000,
transferMs: 5000
}
}
}
});
const request1 = new rcp.Request('https://example.com');
const request2 = new rcp.Request('https://example.com');
session1.fetch(request1).then((response) => {
console.info(`Request1 succeeded, message is ${JSON.stringify(response)}`);
}).catch((err: BusinessError) => {
console.error(`err1: err code is ${err.code}, err message is ${JSON.stringify(err)}`);
});
session1.fetch(request2).then((response) => {
console.info(`Request2 succeeded, message is ${JSON.stringify(response)}`);
session1.close();
}).catch((err: BusinessError) => {
console.error(`err2: err code is ${err.code}, err message is ${JSON.stringify(err)}`);
session1.close();
});
// 随时可以取消单个请求
session1.cancel(request1);
实战建议:
- 下载/上传模块可以单独一个 Session,配大一点的超时和连接池;
- 普通小接口/API 调用用另一个 Session,超时更短,避免拖垮整体;
- 遇到用户离开页面 / 页面销毁:直接取消对应 Session 里的请求,省电又省流量。
三、DNS 阶段:自定义 DNS 规则拿更快解析
在 DNS 阶段,你可以用 Configuration.dns 做两种事情:
- 重写 DNS 解析函数(动态规则)
- 指定自定义 DNS 服务器(自建 DNS)
1. 重写 DNS 解析函数(函数式 dnsRules)
const session = rcp.createSession();
const request = new rcp.Request('https://example.com');
request.configuration = {
dns: {
dnsRules: (host: string, port: number): rcp.IpAddress[] => {
if (host === 'example.com') {
// 直接返回 IP 列表
return ['7.128.8.45', '7.128.8.46'];
}
return [];
}
}
};
session.fetch(request).then((response) => {
console.info(`Request succeeded, message is ${JSON.stringify(response)}`);
}).catch((err: BusinessError) => {
console.error(`err: err code is ${err.code}, err message is ${JSON.stringify(err)}`);
});
适合场景:
- 某个域名在特定网络环境下需要走「内网 IP / 特定机房 IP」;
- 做灰度:部分用户/请求命中不同 IP 池;
- 快速绕开上游 DNS 异常。
2. 定制 DNS 服务器(静态 DnsServers)
const session = rcp.createSession();
const request = new rcp.Request('https://example.com');
request.configuration = {
dns: {
dnsRules: [
{
ip: '7.128.8.45',
port: 53,
},
]
}
};
session.fetch(request).then((response) => {
console.info(`Request succeeded, message is ${JSON.stringify(response)}`);
}).catch((err: BusinessError) => {
console.error(`err: err code is ${err.code}, err message is ${JSON.stringify(err)}`);
});
适合场景:
- 产品内置自家 DNS 服务器;
- 需要固定使用某个安全 DNS / DoH 服务。
四、连接阶段:合理调优连接池
connectionConfiguration 主要两个参数:
maxConnectionsPerHost:同一 Host 最大连接数maxTotalConnections:所有 Host 总连接上限
const session = rcp.createSession({
connectionConfiguration: {
maxConnectionsPerHost: 16,
maxTotalConnections: 1024,
}
});
for (let i = 0; i < 1024; ++i) {
session.get('https://example' + i.toString() + '.com/image.png')
.then((response) => {
console.info(`Request succeeded, message is ${JSON.stringify(response)}`);
}).catch((err: BusinessError) => {
console.error(`err: err code is ${err.code}, err message is ${JSON.stringify(err)}`);
});
}
调优思路:
- 图文流 / Feed / 资源密集场景:
- 适度提高
maxConnectionsPerHost,提升并发下载速度;
- 适度提高
- 资源很分散的场景(多域名):
- 提高
maxTotalConnections,避免被总连接数卡死;
- 提高
- 但不要无脑拉满:
- 太多连接会压服务器,也会耗电 & 增加切换成本。
五、HTTP 请求阶段:流式 & 分段,省内存就靠它
这里主要三件事:
- 响应体可以直接写入文件(避免整个拉到内存)
- 响应体可以分段返回(跟你前面学的 Stream 结合)
- 请求体可以分段上传(适合大文件)
1. 响应体直接写入文件
const session = rcp.createSession();
try {
const response = await session.get('https://example.com/video.mp4', {
kind: 'file',
file: './video.mp4',
});
console.info(`Request succeeded, message is ${JSON.stringify(response)}`);
} catch (err: any) {
console.error(`err: err code is ${err.code}, err message is ${JSON.stringify(err)}`);
} finally {
session.close();
}
适合场景:
- 大文件下载(视频、离线包、模型文件);
- 不想自己手动分段写文件时的“简单版”用法。
2. 分段上传数据(函数式 content)
const session = rcp.createSession();
try {
const response = await session.post('https://example.com/video.mp4', (maxSize: number) => {
// 每次框架请求一块数据时,你返回一个 ArrayBuffer
// 示例是直接 new 一块,实际可以从文件里 read
return new ArrayBuffer(maxSize);
});
console.info(`Request succeeded, message is ${JSON.stringify(response)}`);
} catch (err: any) {
console.error(`err: err code is ${err.code}, err message is ${JSON.stringify(err)}`);
} finally {
session.close();
}
实战里通常会:
- 把
(maxSize) => { ... }里改成「从文件 / 流里读数据」; - 配合前面讲的
uploadFromStream/NetworkInputQueue,搞一个完整的大文件上传链路。
六、HTTP 响应阶段:用 timeInfo 动态调策略
拿到响应后,可以通过 response.timeInfo 查看各阶段耗时:
const session = rcp.createSession();
try {
const response = await session.get('https://example.com');
console.info(response.timeInfo?.nameLookupTimeMs?.

浙公网安备 33010602011771号