分布式数据一致性小结

简介

分布式一致性问题包括数据一致性问题事务一致性问题。在此仅关注数据一致性问题数据一致性问题是因为分布式系统下数据需要复制而导致的。

数据一致性模型就是规定在并发的进行数据复制时,每个节点应该看到的视图是怎样的。
不同的 数据一致性模型 对于视图的规定不一样。

假设:
在这里插入图片描述
有两个进程 p1p2,各自发生的事件为 p1_1、p1_2p2_1、p2_2
如果不做任何限制,那么这四个事件在全局所有节点看来有 4! 种可能(由于网络波动或者任何原因,这些事件会完全的乱序由别的节点感知到)。
在这里插入图片描述
一致性模型 就是对事件的排列做出限制,让所有节点只可以感知到受限集合内的事件发生顺序。而限制集合内的事件发生顺序(视图)符合的特性就是 一致性模型 的特性。

在此只介绍几种常见的 一致性模型,包括:线性一致性顺序一致性因果一致性单调读单调写读己所写读后写

一、线性一致性

最强的一致性,要求分布式系统需要有一个全局时钟,在全局时钟下按顺序发生的事件,在各个节点处理时也必须按全局时钟顺序发生。即各个进程看到的操作顺序和全局时钟下的顺序一致。

简介中的例子,假设全局时钟下发生的顺序为 p1_1、p1_2 、p2_1、p2_2,则集群内的所有节点看到的顺序都是这个顺序。

如何实现线性一致性? 可以使用 raft 协议,读写请求都由主节点处理需要保证写请求必须在 apply 到状态机后才能返回给客户端,这样子可以保证在写请求从客户端发出到写请求 apply 到状态机期间发生的所有读操作,都算是并发的操作,这样子可以保证线性一致性。
即:

x = 0(初值)
P1:|----write x = 1 ----- apply x = 1--------------|  |---- read x = 1 --|
P2:           |----
### 抢购场景下的分布式事务数据一致性解决方案 在抢购场景中,由于高并发请求的存在,传统的单体事务机制难以满足需求。为了保证分布式环境中的数据一致性,可以采用以下几种常见方案: #### 1. 基于消息队列的最终一致性方案 此方法通过引入消息中间件(如Kafka、RabbitMQ),将订单创建和库存扣减的操作解耦[^1]。当用户下单成功后,系统会向消息队列发送一条消息通知库存服务减少对应商品的数量。如果库存扣减失败,则可以通过补偿机制重新尝试执行。 优点在于能够有效缓解流量高峰带来的压力;缺点则是存在短暂的时间窗口,在这段时间内可能会出现超卖现象。因此还需要配合其他手段比如乐观锁来进一步增强控制力。 ```java // Java伪代码示例:利用消息驱动实现订单与库存分离处理 @Service public class OrderService { @Autowired private RabbitTemplate rabbitTemplate; public void createOrder(Order order){ // 创建订单逻辑... // 发送消息给库存服务 rabbitTemplate.convertAndSend("inventory.exchange", "key", new InventoryDeductionMessage(order)); } } ``` #### 2. TCC (Try-Confirm-Cancel) 模式 TCC是一种强一致性的两阶段提交协议变种形式,适用于对实时性要求较高的业务场景。其核心思想是在实际修改资源之前先预留资源(Try),之后再确认(Confirm)或者取消(Cancel)[^3]。例如,在抢购过程中,“Try”阶段锁定一定数量的商品供后续操作使用;一旦整个流程顺利完成则调用“Confirm”,反之则触发“Cancel”。 该方式虽然复杂度较高但能较好地应对各种异常情况,确保即使发生部分失败也能回滚到初始状态从而维持全局一致性。 #### 3. 分布式锁技术 为了避免因多线程或多实例同时访问同一份共享资源而导致的竞争条件问题,可借助Redis等内存数据库提供的分布式锁功能来进行同步管理。每当某个客户端获取到了特定商品对应的唯一标识作为钥匙打开这把虚拟之锁以后才能继续往下走完成购买动作直至释放为止期间不允许任何其他人进来干扰。 需要注意的是设置合理的过期时间防止死锁以及考虑到网络延迟等因素可能造成误判的情况采取重试策略加以弥补不足之处。 --- #### 小结 综上所述,针对抢购这种特殊环境下涉及到跨多个子系统的交互行为时,推荐优先考虑基于事件驱动的消息传递模型辅以必要的保护措施诸如版本号校验或是悲观/乐观加锁等方式共同作用达成目标效果最佳平衡点既兼顾效率又不失精确程度。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值