XA方案/两阶段提交方案
这个可以看我之前发的分布式事务之2PC和3PC
2PC主要使用场景是一个系统中有多个数据源,这多个数据源之间需要事务去保证数据的一致性,具体方案就是JTA 使用JTA实现多数据源的事务管理。 但开发中不建议直接操作别的数据库,多数据源很多都是为了查询数据,不会设计到增删改数据,所以不常用。
TCC方案
try - confirm - cancel 拿银行转账举例子:
-
try:资金校验、冻结
-
confirm:转账
-
cancel:如果转账失败手动补偿/恢复数据
适用场景,对一致性要求极高
本地消息表方案
image-
A系统先插入业务表处理A系统中的业务逻辑,再插入消息表,状态是待确认,在zk中对orderId=xx的node进行监听
-
通过mq发消息给B系统
-
B系统先插入消息表,并且防止重复消费,必须保证幂等性
-
B系统进行业务操作,如果成功,修改消息表中的值,修改zk中的值,A系统监听到后,修改消息表中的值
-
B系统如果失败了,就不会修改消息表,A系统会轮询A系统的消息表,超时没有成功的会再次发送,超时时间和重试次数根据自己业务情况来定
缺点:大量依赖消息表,高并发场景下不适用
可靠消息最终一致性方案
image为了高并发,舍弃消息表,基于MQ来实现事务,阿里的RocketMQ就支持事务
最大努力通知方案
image系统A执行完会发送消息到MQ,MQ通知最大努力通知系统,然后最大努力通知系统会记录这个消息,发给系统B,直到成功,或者到达最大重试次数。
总结
尽量避免分布式事务。
网友评论