分布式小记

/ 默认分类 / 没有评论 / 41浏览

分布式锁

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.数据库