1.分布式事务问题 有三种情况
2.cap理论
一致性(Consistency):服务A、B、C三个结点都存储了用户数据, 三个结点的数据需要保持同一时刻数据一致性。
可用性(Availability):服务A、B、C三个结点,其中一个结点宕机不影响整个集群对外提供服务,如果只有服务A结点,当服务A宕机整个系统将无法提供服务,增加服务B、C是为了保证系统的可用性。
分区容忍性(Partition Tolerance):分区容忍性就是允许系统通过网络协同工作,分区容忍性要解决由于网络分区导致数据的不完整及无法访问等问题。
分布式系统不可避免的出现了多个系统通过网络协同工作的场景,结点之间难免会出现网络中断、网延延迟等现象,这种现象一旦出现就导致数据被分散在不同的结点上,这就是网络分区
在保证分区容忍性的前提下一致性和可用性无法兼顾,如果要提高系统的可用性就要增加多个结点,如果要保证数据的一致性就要实现每个结点的数据一致,结点越多可用性越好,但是数据一致性越差。所以,在进行分布式系统设计时,同时满足“一致性”、“可用性”和“分区容忍性”三者是几乎不可能的
CAP有哪些组合方式?
1、CA:放弃分区容忍性,加强一致性和可用性,关系数据库按照CA进行设计。
2、AP:放弃一致性,加强可用性和分区容忍性,追求最终一致性,很多NoSQL数据库按照AP进行设计。
说明:这里放弃一致性是指放弃强一致性,强一致性就是写入成功立刻要查询出最新数据。追求最终一致性是指允许暂时的数据不一致,只要最终在用户接受的时间内数据 一致即可
3、CP:放弃可用性,加强一致性和分区容忍性,一些强一致性要求的系统按CP进行设计,比如跨行转账,一次转账请求要等待双方银行系统都完成整个事务才算完成。
说明:由于网络问题的存在CP系统可能会出现待等待超时,如果没有处理超时问题则整理系统会出现阻塞
总结: 在分布式系统设计中AP的应用较多,即保证分区容忍性和可用性,牺牲数据的强一致性(写操作后立刻读取到最新数据),保证数据最终一致性。比如:订单退款,今日退款成功,明日账户到账,只要在预定的用户可以接受的时间内退款事务走完即可。
3.base理论
- ba:基本可用
- s:柔性事务
- e:最终一致性
解决方案:
1.公司生产环境正在用的一种 利用mq的事务消息机制
- 商城服务 接收扣钱请求,开启事务消息,执行数据库扣钱操作,提交/回滚消息
- 礼物服务 接收mq消息,消费消息,异常则放回队列中。需要一个礼物日志,记录消息的业务id,防止重复消费,保证幂等性
2.公司生产上用的另一种方式 rpc调用中间态检查
- 礼物服务数据库记录送礼记录,生成流水号,状态为未确认状态
- 礼物服务中rpc调用商城服务扣钱,传入流水号。
- 商城校验正常失败(货币不足等)则返回前端失败信息,成功则返回成功信息,删除礼物日志
- 异常情况(链接超时)则退出
- 定时任务扫描礼物日志,根据流水号,去商城确认。成功的执行成功逻辑,扣钱失败的删除记录
3.未使用的 tcc 事务补偿机制
- 引入tcc事务框架,代码侵入性高。需要再其他服务中实现try,commit,cancel接口