分布式能力不是功能,而是一种架构约束


网罗开发 (小红书、快手、视频号同名)

大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验 。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员

👋 大家好,我是展菲!

📱 全网搜索"展菲",即可纵览我在各大平台的知识足迹。

📣 公众号"Swift社区",每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。

💬 微信端添加好友"fzhanfei",与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。

📅 最新动态:2025 年 3 月 17 日

快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!

文章目录

引言

很多开发者第一次接触鸿蒙分布式能力时,理解是这样的:

复制代码
跨设备传数据
多端同步
远程调用

于是大家把它当成:

"一个可以用的功能模块"

比如:

  • 需要同步数据 → 用分布式数据
  • 需要跨设备 → 调 startAbility

听起来没问题。

但如果你真的做过一个"跨设备可用"的鸿蒙 App,很快就会发现:

分布式能力不是"你想用就用",而是"你必须围绕它设计"。

也就是说:

它不是功能,而是一种架构约束。

一、为什么很多项目用不好分布式能力

因为大多数项目一开始是这样设计的:

复制代码
单设备思维
↓
开发完成
↓
再加分布式能力

结果会出现:

  • 数据不同步
  • 状态混乱
  • 页面无法恢复
  • 跨设备体验割裂

典型错误

ts 复制代码
// 本地状态
this.currentUser = user

// 想同步时再写
kvStore.put("user", user)

问题在于:

你的数据模型从一开始就不是"分布式的"。

二、分布式能力真正改变的是什么

很多人以为它改变的是:

复制代码
数据同步方式

但本质上,它改变的是:

系统的"边界定义"。

传统 App

复制代码
设备 = 系统边界

所有东西都在:

复制代码
一个设备
一个进程
一个状态

鸿蒙分布式

复制代码
用户 = 系统边界

也就是说:

复制代码
多个设备共享一个"逻辑应用"

这意味着:

你的应用,从"单机系统"变成了"分布式系统"。

三、架构上的三个强制变化

这才是最关键的地方。

1 状态必须"可同步"

传统写法:

ts 复制代码
@State count: number = 0

只存在于当前设备。

分布式设计:

ts 复制代码
class DistributedState {

  async set(key: string, value: any) {
    await kvStore.put(key, value)
  }

  async get(key: string) {
    return await kvStore.get(key)
  }

}

所有核心状态:

复制代码
必须可以被同步

2 UI 不能依赖本地上下文

错误写法:

ts 复制代码
this.deviceId // 强依赖当前设备

正确思路:

ts 复制代码
render(state) {
  return state.user
}

UI 应该只依赖:

复制代码
状态,而不是设备

3 任务必须可迁移

传统任务:

复制代码
只能在当前设备执行

分布式任务:

ts 复制代码
class Task {

  async execute(deviceId?: string) {
    if (deviceId) {
      return await remoteExecute(deviceId)
    }
    return await localExecute()
  }

}

任务必须支持:

复制代码
跨设备执行

四、一个典型错误案例

很多人会这样写:

ts 复制代码
aboutToAppear() {
  this.loadLocalData()
}

问题:

复制代码
换设备 → 数据丢失

正确做法:

ts 复制代码
aboutToAppear() {
  this.loadDistributedData()
}

甚至更进一步:

ts 复制代码
onPageShow() {
  this.state = await distributedState.get("app_state")
}

五、分布式架构应该怎么设计

推荐结构

复制代码
UI(设备无关)
   ↓
State(分布式)
   ↓
Service(业务逻辑)
   ↓
Distributed Layer(同步 / 通信)

示例

ts 复制代码
class UserService {

  async getUser() {
    return await distributedState.get("user")
  }

}

UI:

ts 复制代码
aboutToAppear() {
  this.user = await userService.getUser()
}

UI 完全不关心:

复制代码
数据来自哪个设备

六、分布式带来的"约束思维"

这是最重要的一点。

1 不再假设"本地唯一"

错误:

复制代码
我这里就是唯一状态

正确:

复制代码
状态可能在别的设备被修改

2 不再假设"顺序执行"

错误:

复制代码
A → B → C

正确:

复制代码
A / B / C 可能在不同设备执行

3 不再假设"UI 是中心"

传统:

复制代码
UI 控制一切

分布式:

复制代码
状态才是中心

七、和 AI 架构的结合

有意思的是: 分布式能力和 AI 架构是天然契合的。

AI 关注:

复制代码
任务
能力
状态

分布式提供:

复制代码
跨设备执行能力

例如:

ts 复制代码
await agent.run("打开会议文档")

系统可能:

ts 复制代码
// 平板展示文档
openOnTablet()

// 手机做控制
bindControl()

用户完全无感:

复制代码
设备切换

八、为什么说它是"架构约束"

因为一旦你决定支持分布式,你就必须:

  • 重构状态管理
  • 重构数据流
  • 重构任务模型

否则结果就是:

复制代码
功能能跑
体验崩溃

九、本质

如果用一句话总结:

分布式能力不是"你可以用",而是"你必须围绕它设计"。

对比:

维度 传统 App 分布式鸿蒙
系统边界 设备 用户
状态 本地 全局
任务 单点执行 可迁移
UI 中心 表现层

总结

很多开发者会把分布式能力当成:

复制代码
一个高级功能

但真正做过项目的人会发现:

它更像是一种"约束规则"。

如果你不遵守:

  • 架构会崩
  • 状态会乱
  • 体验会断

但如果你从一开始就按分布式设计,你会得到一个完全不同的应用:

复制代码
跨设备
无缝体验
任务连续
相关推荐
0xDevNull2 小时前
Apache Kafka 完全指南
分布式·kafka
jerwey2 小时前
app-unavailable-in-region
架构
志摩凛2 小时前
范畴论——前端与计算机领域的“抽象工具箱”:该用则用,该弃则弃
算法·架构
vivo互联网技术3 小时前
营销自动化数据驱动 - 多源数据 OLAP 架构演进
架构
zb200641203 小时前
RabbitMQ 客户端 连接、发送、接收处理消息
分布式·rabbitmq·ruby
尘世中一位迷途小书童3 小时前
npm 包入口指南:package.json 中的 main、module、exports
前端·javascript·架构
风123456789~3 小时前
【架构专栏】第2章 计算机系统基础知识 1/3
笔记·架构
weixin_6683 小时前
BPMN.io全方位深度分析报告架构解析 - AI分析分享
人工智能·架构·开源