分布式事务

实际问题的产生:

实例:订单到支付(锁库存、发积分等业务多)

情况:

本地服务、操作本地数据库、本地事务无问题

调用远程服务,就出现了分布式事务,无法控制其他服务的回滚

产生分布式事务的最大原因:网络问题,

事务的基本性质:ACID

事务的隔离级别

本地事务失效问题:

问题:同一对象方法互调,覆盖事务

解决:使用代理对象调用事务方法,aspectj

@EnalbleAspectJAutoProxy(exposeProxy = true)

分布式事务的定理

CAP

BASE理论

强一致性、弱一致性、最终一致性

分布式事务的几种方案

1、2PC、3PC(自动TCC)

2、柔性事务、TCC补偿事务,

3、柔性事务、最大努力通知

4、柔性事务、可靠消息、最终一致性(异步确保性)

解决框架Seata

提供了AT、TCC、SAGA、XA事务模式

TC 事务协调器

TM 事务管理器

RM 资源管理器

步骤

1、创建数据库表

2、AT模式,每个微服务/库增加,创建UNDO_LOG表 (UNDO:回滚)

UNDO_LOG表有固定的业务字段

3、安装SEATA-server

4、整合

4.1,pom依赖

4.2、根据依赖的版本、启动对应版本server

   registry_config文件

配置注册中心(例如nacos)、

指定相关配置 file-config,例如NIO,TCP、store(db-store)

  每个微服务增加file.config(修改service微服务对应名字),registry.conf

4.3启动server,登录nacos,查看serverAddr—即seata服务器

5、开启:

所有想用到分布式事务的微服务,都需要seata作为代理数据源

6、给分布式大事务入口(方法)标记全局事务

给每个远程的小事务配置单事务(方法)

@GlobalTransication

@Transicastion(本地自己处理)

模式适用
AT、阻塞,不适合高并发(2PC,TCC不适合高并发)。例如后台管理系统

使用MQ消息队列处理、避免事务阻塞

如何保证消息可靠性

1、消息丢失

1.1情况:网络错误,消息没抵达服务器:

解决:Try catch 捕获发送失败,发送消息都记录日志,数据库中保存每个消息的详细信息,

定期扫描数据库,将失败的消息再发送。

1.2情况:Broker宕机

解决:使用发送者的确认机制,confirmCallback、returnCallback监听

1.3 手动ACK

2、消息重复

2.1情况:ack失败、会重复消费。消费者的业务消费接口应该设计为幂等性、防重表、判断是否redelivered

2.2消费失败,自动发出,正常

3、消息积压

3.1 消费者宕机

3.2 消费者消费能力不足

3.3 发送者发送流量太大

解决:1、增加消费者,上线专门的队列消费服务器,先取存,后离线处理。2、限流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值