优点
(一)可靠性(容错)
分布式计算系统中的一个重要的优点是可靠性。一台服务器的系统崩溃并不影响到其余的服务器。
(二)可扩展性
在分布式计算系统可以根据需要增加更多的机器。
(三)资源共享
共享数据是必不可少的应用,如银行,预订系统。
(四)灵活性
由于该系统是非常灵活的,它很容易安装,实施和调试新的服务。
(五)更快的速度
分布式计算系统可以有多台计算机的计算能力,使得它比其他系统有更快的处理速度。
(六)开放系统
由于它是开放的系统,本地或者远程都可以访问到该服务。
(七)更高的性能
相较于集中式计算机网络集群可以提供更高的性能(及更好的性价比)。
分布式会话session解决方案
- tomcat + session–》使用Redis缓存tomcat的session数据
tomcat增加配置,将session托管给redis管理(RedisSessionManager)
- spring session + redis
如何设计一个高可用的分布式系统
- 针对模块进行系统拆分,一拆多
- 对于大量的读请求,使用缓存处理
- 对于大量的写请求,使用MQ进行削峰处理
- 数据库进行分库分表
- 数据库读写分离
- 使用搜索引擎
系统限流
实现思路:拦截打到项目的前端请求
- 计算器法:单秒对请求进行计数,超过系统承受的最大域值,快速失败
- 滑动窗口计数法:将时间拆为更细的粒度
- 漏桶算法:固定的空桶 + 固定的处理线程(保护下游系统)
- 令牌桶算法:桶容量跟阈值相关,想完成请求,必须在桶里拿到令牌 (保护上游系统)
分库分表
- 垂直拆分
将一个表的n个字短按访问频率分组,假设表里有1000w条数据,分完两个库后,
A库有1000w条数据,字短访问较高,
B库有1000w条数据,字短访问较低
- 水平拆分
将1000w条数据均匀的拆分到n个表,A库有500w条数据,B库有500w条数据
单表系统向分库分表迁移方案
- 线上服务停机,使用自己的后台程序,将现有的数据分到对应的库,表
- 不停机,对数据进行双写,单表,分表数据同时进行新增,同时书写程序,保证旧数据逐步向分库分表进行迁移,单写分库分表
Mysql 主从复制延时解决方案
- 增加写服务器的数量
- 避免新增,更新完之后立马执行
- 指定从主库查询
- 打开mysql的并行复制
分布式事务的解决方案
- XA(两阶段提交方案)
第一阶段:事务管理器询问各个库sql是否可以执行
第二阶段:执行
- TCC
try:做一些预准备工作
confirm:执行操作
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系统需要实现幂等性