分布式系统
分布式事务
分布式事务实现方案
最大努力通知nginx
- 基于BASE理论作的保证数据最终一致性方案,基本可用,软状态,最终一致性
- 具体实现为,写本地事务,同步写一张事务消息表,发送事务消息,消息异步通知关联系统,处理失败则利用MQ的重试功能作自动重试,超太重试次数记录失败状态,定时任务扫描手动处理
TCC事务补偿方案redis
- 须要一个事务处理器
- 每一个事务必须实现try、confirm、cancel三个方法,开发维护成本高
- 阿里开源框架实现seata
基于可靠消息的最终一致性方案算法
- RocketMQ有事务消息的实现
- 具体原理为,业务方发送一个事务消息,MQ将消息落表,此时消息对消费方不可见
- 发起方执行本地事务,通知MQ提交或回滚
- MQ会定时查询发起方的事务执行状态,决定提交或回滚
TCC的优缺点
* 每一个事务必须实现try、confirm、cancel三个方法,开发维护成本高
* 事务管理器也存在单点问题
* 事务管理器事务活动日志的存储成本
两阶段提交与三阶段提交的区别
* 三阶段提交相比两阶段提交多了第 0 步检查是否可提交,下降了反复的“锁定-释放”的可能
SpringCloud
- 微服务服务发现与调用流程
服务提供者启动将本身的注册到eureka
服务消费者经过serviceId到eureka拉取服务提供者的实例IP
服务消费者经过Ribbon,默认采用轮询的方式调用消费者IP列表中实例
ribbon的重试机制数据库
- 默认超时后重试原实例一次
- 可配置重试其余实例的次数
- 实际配置关闭了重试,由于超时失败下次请求大几率也会失败,重试容易放大故障,增长压力
- ribbon屡次调用一个实例失败会将其剔除吗?
- eureka服务下线感知
有至少30秒延时(认为延时可接受,用无损发布可解决,无损发布使用两个池,一个起来以后将流量切过去)
微服务架构
系统设计的分层思想
*各层独立后端
*只需了解当前层的使用,不须要关心其余层的实现细节
*组件之间独立实现、独立部署
*可使用不一样技术栈,实现多语言开发
*各个服务可根据自身业务负载状况进行实例和数据等资源扩展
*职责专注,业务边界清晰缓存
*能够按业务组织团队
*服务按业务线划分,可减小业务变化时的影响面,减小服务内部修改产生的内耗
*变化和资源隔离网络
*不一样层之间的代码或实现方式修改,不影响其余层
*组件之间调用线程隔离,并引入熔断机制,能够防止服务一挂全挂的状况
*高内聚架构
*将大问题分解成小问题,有利于下降实现难度
*代码容易理解,开发效率高
*有利于代码功能复用
iso协议分层,应用分层等为何分层
*各层独立
*只需了解当前层的使用,不须要关心其余层的实现细节
*变化隔离
*不一样层之间的代码或实现方式修改,不影响其余层
*高内聚
*将大问题分解成小问题,有利于下降实现难度
设计高并发、高可用系统用到的方法
高并发
高并发性,是系统从上到下优化改造的结果,从系统架构到业务处理都要注意处理
架构层面
系统集群化
- 反向代理lvs、网关Nginx、微服务组件、redis都是集群化部署
- 多机同时对外提供服务
- 服务无状态,可无限水平扩容
- 先后端分离,静态页面服务使用CDN加速
- 数据库分库分表、读写分离
业务层面
加缓存
- 加redis缓存,redis热key打散
- Google Guava本地缓存
代码优化,流程优化
- 性能低的代码,如集合类的容量设置,多余的循环,多查的数据,多余的外部请求
异步处理
- 一些非关键业务的落库操做改成异步。如大数据业务染色的token,异步保存,超线程池后,mq延迟消费
并行处理
MQ削峰
- mq消费速率固定,可防止峰值请求冲垮系统
- mq延迟消费
- 设置开关,开启则暂时不消费,应对冲击高峰
- 版本探测机制
- 数据增量返回
- 压测,性能摸底
限流降级
- 网关对接口直接限流,令牌桶算法对占资源的接口限流,以下单、支付等
- 应用层对业务限流,如优惠券使用令牌桶算法,超阈值就异步处理
- 非关键业务直接降级,返回固定值,或服务不可用,关闭风控
高可用
高可用经过集群冗余,加故障自动转移实现
系统集群化,多机同时提供服务
- 入口层:DNS轮询
- 反向代理层:lvs的keeplived+虚ip
- 网关层:nginx的upstream屡次请求一台实例失败,会将这台实例剔除
- 微服务组件层:服务注册与发现,心跳机制
故障自动转移
- 数据冗余,主从切换机制
redis缓存:主从复制,故障转移(线上redis一主一从,16台16G)
数据库:主从同步
流量分配,过载保护
- 负载均衡:轮询、哈希、随机、固定比例、动态比例
限流
限流算法
- 令牌桶:固定速率往桶中放令牌,可应对突发流量
- 漏桶:固定速率从桶中流出请求,适应调下游服务承载能力固定的场景
- 信号量限流:比较暴力,超过阈值直接丢弃请求
分布式限流算法
防故障蔓延
- 容灾:多机房、多活
- 快速回滚
- 性能指标监控