6-10.【多线程】分布式场景下的并发问题有哪些?如何设计幂等任务?如何保证最终一致性?

4 阅读3分钟

在 HarmonyOS 的分布式场景(如跨设备调用、分布式数据服务)中,并发问题从“单机内存隔离”演变成了“网络空间不确定性”。


1. 分布式场景下的核心并发问题

在多设备协同或远程调用(RPC)时,你会遇到以下经典挑战:

  • 三态性(Three States) :在单机请求中只有成功或失败,但在分布式下有:成功、失败、超时(未知) 。超时可能意味着请求没发出去,也可能意味着任务已完成但回执丢了。
  • 时序错乱(Out of Order) :由于网络路径不同,先发起的指令(如“关闭空调”)可能比后发起的指令(如“调高温度”)晚到达目标设备。
  • 重复触发(Duplicate Requests) :网络抖动导致的重试机制,可能让目标设备在短时间内收到多次相同的指令。

2. 如何设计幂等任务(Idempotency)?

幂等性是指:无论一个操作执行多少次,其产生的结果都与执行一次相同。 这是解决分布式重复触发问题的唯一良药。

设计策略:

  1. 全局唯一 ID (Request ID)

    • 为每个分布式任务生成一个 UUID。目标设备在执行前先检查该 ID 是否已在“已处理列表”中。
  2. 状态机约束

    • 任务执行前校验状态。例如:订单状态必须是 PENDING 才能变更为 PAID。如果收到了第二次支付请求,发现状态已经是 PAID,则直接忽略。
  3. 版本号控制(Optimistic Locking)

    • 每次更新数据带上 version。执行更新时匹配版本:UPDATE data SET value = x, version = version + 1 WHERE id = y AND version = current_version

3. 如何保证最终一致性(Eventual Consistency)?

分布式场景下追求“强一致性”会极大牺牲性能和可用性。HarmonyOS 推荐使用最终一致性模型:

A. TCC (Try-Confirm-Cancel) 模式

  • Try:预留资源(如冻结库存)。
  • Confirm:真正执行(如果 Try 成功)。
  • Cancel:回滚资源(如果 Try 失败)。

B. 基于可靠消息的异步补偿

  1. 设备 A 执行完本地操作,发送一个持久化消息。
  2. 设备 B 监听消息并执行操作。
  3. 补偿机制:如果设备 B 执行失败,则通过重试逻辑或发送反向指令(冲正)给设备 A。

C. 分布式数据对象 (Distributed Data Object)

利用 HarmonyOS 内置的分布式数据库。它底层通过 向量时钟(Vector Clock)最后写入者胜(LWW - Last Writer Wins) 冲突解决方法,自动处理多设备同时修改同一份数据的一致性问题。


4. 实战架构建议

需求推荐方案
防止指令重发任务携带 Token/SequenceID,接收方做去重校验。
跨设备数据同步优先使用 分布式数据对象,让系统底层处理冲突逻辑。
长链条业务采用 Saga 模式,将大事务拆分为一系列带补偿逻辑的小事务。

避坑指南:

  • 不要在分布式回调里写 UI 逻辑:远程调用返回时,主线程可能已经切换了页面上下文,直接更新 UI 易引发逻辑错误。
  • 设置合理的超时:分布式调用的超时时间应根据网络环境动态调整,避免无限期挂起 TaskPool 线程。

总结

  • 并发:本质是网络的不确定性。
  • 幂等:靠 ID 和状态机来保底。
  • 一致性:不求瞬时相同,但求最终对齐。