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 做两种事情:

  1. 重写 DNS 解析函数(动态规则)
  2. 指定自定义 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 请求阶段:流式 & 分段,省内存就靠它

这里主要三件事:

  1. 响应体可以直接写入文件(避免整个拉到内存)
  2. 响应体可以分段返回(跟你前面学的 Stream 结合)
  3. 请求体可以分段上传(适合大文件)

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?.
posted @ 2025-12-13 20:23  遇到困难睡大觉哈哈  阅读(2)  评论(0)    收藏  举报