分布式会话session解决方案
- tomcat + session–》使用Redis缓存tomcat的session数据
tomcat增加配置,将session托管给redis管理(RedisSessionManager)
如何设计一个高可用的分布式系统
- 针对模块进行系统拆分,一拆多
- 对于大量的读请求,使用缓存处理
- 对于大量的写请求,使用MQ进行削峰处理
- 数据库进行分库分表
- 数据库读写分离
- 使用搜索引擎
分库分表
将一个表的n个字短按访问频率分组,假设表里有1000w条数据,分完两个库后,A库有1000w条数据,字短访问较高,B库有1000w条数据,字短访问较低
将1000w条数据均匀的拆分到n个表,A库有500w条数据,B库有500w条数据
单表系统向分库分表迁移方案
- 线上服务停机,使用自己的后台程序,将现有的数据分到对应的库,表
- 不停机,对数据进行双写,单表,分表数据同时进行新增,同时书写程序,保证旧数据逐步向分库分表进行迁移,单写分库分表
Mysql 主从复制延时解决方案
- 增加写服务器的数量
- 避免新增,更新完之后立马执行
- 指定从主库查询
- 打开mysql的并行复制
分布式事务的解决方案
第一阶段:事务管理器询问各个库sql是否可以执行
第二阶段:执行
try:做一些预准备工作
/confirm/i:执行操作
cancel:回滚操作
1:A系统在本地执行事务的同时,插入一条数据到消息表
2:A系统发送消息到MQ中
3:B系统接到消息之后,将一条数据放入消息表,同时执行其他的业务操作
4:B系统执行成功之后,改写AB两系统的消息表数据状态
5:A系统会定时扫描自己的消息表,将长时间失败的数据重发到B系统,让B再次处理
6:可以保证最终一致性,B系统相同消息只消费一次,哪怕失败了,A系统也会不断向B系统重发消息直至B系统消费成功
1:A系统发送prepared消息到MQ,然后执行A系统业务操作
2:A系统业务操作失败,则发送消息对prepared消息进行回滚
3:A系统操作成功,则发送消息对prepared消息进行confirm
4:B系统执行本地事务
5:MQ自动轮询所有的prepared消息,回调A系统确认此条消息的状态
6:B系统需要实现幂等性