分布式锁
1.锁的选择
mysql,redis,zookeeper,etcd
2.分布式锁与本地锁同时使用
同进程内,使用本地锁限制多个访问相同分布式锁的任务;
分布式事务
A执行本地事务并调用B服务
1.消息队列+本地消息表,性能高
==> A执行本地业务,相同本地事务写入本地消息表(后台定时任务轮询一定时间未成功发送的任务重新发送),发送消息队列
==> A发送的消息队列发送成功,修改A的本地消息为已发送
==> B接收到消息队列消息后,支持幂等性直接执行任务或写入本地消息表,由其他定时任务读取消息表任务执行
2.rocketMQ,事务消息半消息回查机制
==> A发送半消息到消息队列成功后,执行本地事务成功后,发送确认消息到消息队列(此处可能由于网络等原因为成功发送到消息队列)
==> 消息队列如收到确认消息,则发送到B,如一定时间未收到确认则使用回查机制进行主动确认
==> B收到消息进行后续操作
3.使用其他如TCC,Seata等分布式事务框架
TCC:
调用多个服务业务,需要它们共同配置相同数据库的事务管理配置; 主服务业务及其他子服务需要编写tcc业务(Try-Confirm-Cancel),主服务执行业务时,向子服务传递唯一事务id,事务管理器进行全部事务的管理;(包括定时检查事务超时等问题)
Seata:
首先根据事务管理器生成XID事务唯一编码,并保存在当前线程上下文中等待传递; 在本地服务中,利用代理数据库连接池解析执行的语句,生成前后SQL镜像,及相应的行锁BranchID,本地事务提交保存,用来后面的回滚; 在调用外部服务时,如使用Feign,则使用请求拦截器传递XID到其他服务,其他服务在收到请求时如Http协议则根据Header获取到XID也保存到当前线程上下文保存; 当一阶段结束,则全局事务管理器执行二阶段提交,回滚则根据各服务日志进行回滚,提交则批量删除日志的前后镜像及行锁等信息,其中客户端资源管理器和独立的事务协调器使用Netty通信; 在一次事务中,会多次访问数据库;
抗住并发
1.DNS分流 2.CDN 3.负载均衡 4.缓存 5.消息队列 6.数据库
本文由 GY 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2022/06/01 15:05