分布式数据一致性(库存)

本文探讨了在分布式环境中如何处理购物车与库存数据一致性问题,提出了基于最终一致性的实现设计。通过记录每个操作的动作并在离线时进行核对,确保事务的正确执行。介绍了事务、动作和链接的概念,并详细阐述了数据库事务状态表的设计以及如何避免动作重复执行。

库存冻结现状

目前购物车添加商品、删除商品、修改商品数量、购物车过期库存解冻、成单后清空购物车,都涉及库存变化。

以添加商品为例,目前实现逻辑为:

1、调用库存系统扣减库存

2、购物车写库

3、第2步失败时,调用库存系统回滚库存。

以上均为线上同步调用。网络抖动时,产生的数据不一致系统无法自动恢复。

购物车与库存数据一致性

因购物车和库存系统分属不同的数据库,此处涉及分布式事务问题。

互联网系统出于系统性能的考虑,一般不追求实时一致性,而目标转向最终一致性。

最终一致性,可基于消息和处理状态实现。参考文章

以添加商品为例,实现逻辑仍与现有基本一致。一个事务可分解为3个动作:冻结库存、购物车写库、库存还原

每个动作都在本地库进行操作记录,离线定时对前后两个动作的操作记录进行核对,后一动作有缺失则进行重新触发。

最终一致性实现设计

概念定义:

1、事务(Transaction):购物车每次添加商品、删除商品、修改商品数量,称之为一个事务。

2、动作(Action):具体的数据写入操作,称之为一个动作。
以数据库为单元切分,不同数据库的操作必须切分为不同的动作。同一数据库的连续操作,可合并为一个动作。

3、链接(Link):前后相邻两个动作,需离线进行核对,称之为链接。先执行的动作简称为前动作,后执行的动作简称为后动作。
每个动作只能对应一个链接输入,可以对应多个链接输出。

由此,一个事务处理逻辑,可形成一个单向无环图。图的节点表示动作,连线表示链接,箭头方向表示处理先后顺序。

### 分布式系统的数据一致性 #### 数据一致性的定义 在分布式系统中,随着系统架构的演进,原本可以在单体应用中通过原子性操作保障的数据一致性,在拆分为多个独立的服务之后变得复杂。这些服务可能分布在不同的节点上,并通过网络通信协作完成任务。为了使各个子系统的信息、工作进度以及状态保持同步并协调有序地运行,就需要解决分布式环境下的数据一致性问题[^2]。 #### 主要挑战 当一个大型应用程序被分解成若干个小规模的应用程序时,原来可以通过单一数据库事务(遵循ACID特性)来维护的关系型数据模型不再适用。例如在一个电商场景下,如果订单管理和商品库存管理分别属于两个不同微服务,则确保这两个表之间的一致性变得更加困难。因为它们现在位于不同的物理位置并通过网络连接起来;而且考虑到网络可能出现延迟甚至中断等情况,这进一步增加了实现强一致性的难度[^3]。 #### 实现方法概述 针对上述提到的问题,有几种常见的策略用于达成不同程度上的数据一致性: - **CAP定理与BASE理论** CAP 定理指出任何一个分布式计算系统只能同时满足一致性(Consistency),可用性(Availability) 和分区容忍性(Partition tolerance) 中的两项。因此设计者需权衡三者关系以适应具体应用场景需求。而 BASE 是一种弱于 ACID 的原则集合,它提倡基本可用(Basically Available), 软状态(Soft State) 及最终一致性(Eventual Consistency)[^1]。 - **两阶段提交协议(Two-phase Commit, 2PC)** 这是一种传统的方法用来保证跨多个资源管理器的操作能够作为一个整体成功或者全部回滚。然而这种方法存在性能瓶颈并且容易造成阻塞等问题。 - **TCC模式(Try Confirm Cancel)** TCC 提供了一种更灵活的方式来处理复杂的业务逻辑转换过程中的补偿机制。每个参与者都需要提供三个接口:Try 预留资源;Confirm 正式确认变更;Cancel 撤销已做的预备动作。这种方式允许更加细粒度控制整个流程的状态迁移路径。 - **可靠消息传递(Reliable Messaging with Eventual Consistency)** 如文中所描述,该方案依赖于消息中间件作为中介层传输指令给各参与方。核心在于如何确保本地事务执行完毕后消息一定能送达目标端点,同时也需要考虑接收端对于重复到达的消息具备幂等能力以便安全重试未成功的投递尝试[^4]。 ```python def send_message_with_transaction(transaction_id): try: # 执行本地事务 perform_local_operation() # 发送消息到MQ message_queue.send(f"Transaction {transaction_id} completed.") except Exception as e: rollback_local_operation() # 如果任何一步失败则回滚所有更改 raise e def consume_and_process(message): transaction_id = extract_transaction_id_from_message(message) if not is_already_processed(transaction_id): # 幂等检查 process_remote_service_logic() mark_as_processed(transaction_id) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值