分布式系统架构:技术栈详解与快速进阶
上QQ阅读APP看书,第一时间看更新

1.4.3 数据一致性

由于数据架构需要提供多节点部署,不同节点之间通信存在数据差异,在很多场景下往往会产生脏数据、异常数据,让业务不能正常运转。数据一致性指关联数据之间的逻辑关系是否正确和完整。那么在分布式情况下如何让不同模块之间的数据保证完整性、一致性?

可以从系统构建层面考虑,采用分布式事务处理,牺牲一部分性能去保证数据一致性。

【示例】 电商系统

在购物平台看中一款商品,然后加入购物车,下单成功后生成订单,支付成功后扣除账户余额,然后通知仓库发货,生成物流轨迹。如果商品库存、订单、支付、仓库等应用模块独立部署,各模块之间通过远程调用,则正常流程是所有应用模块调用都正常返回。若出现异常,需要考虑以下场景。

1)商品库存数量已扣除,订单正常下单成功,由于网络异常等原因,提示用户“下单失败”,用户刷新页面后,显示一个“未支付订单”;

2)订单正常下单成功,用户支付成功后,由于网络异常等原因,提示用户“支付失败”,用于刷新页面后,显示“已支付成功”;

3)用户支付成功后,通知仓库发货,由于网络异常等原因,仓库系统未发货,无轨迹;

4)用户支付成功后,通知仓库发货,仓库可能没有货品,但商品数量已扣减,用户余额已扣除等。

系统拆分成多个应用模块后,往往会存在数据不一致性等问题,不同模块之间通过远程调用存在多种不确定因素,如调用过程中顺序不同,网络、宽带、超时等一系列问题,增加了系统复杂性。

假如把商品库存、订单、支付、仓库多个应用模块并行调用,也就是同时调用这些模块进行业务处理,由于同时调用不同模块存在延迟、网络异常等情况,需要设定合理的超时机制。并行执行过程中任意模块执行失败或者超时时,模块执行状态差异需要通过消息发布/订阅等模式,通知以上全部模块进行失败处理,相关模块收到消息后,进行幂等处理,进而执行失败处理。

注意

保证消息发布/订阅的可用性、可靠性,让业务模块都能正常接收消息。任意模块执行失败或者超时等情况出现时,由于涉及模块众多,业务复杂,应通知相关模块进行失败处理。