极客时间架构师培训 1 期 - 第 11 周作业
导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。
一、导致系统不可用的原因
硬件故障
服务器硬盘,内存等损坏等等原因,造成系统崩溃,不可用。
软件 bug
架构设计不合理,程序设计不合理等原因,引起系统 bug,造成系统内存泄漏等问题,造成系统不可用
系统发布
没有规范的发布流程,造成系统发布的失败,造成系统不可用用
并发压力
网站业务的增长,系统承受的并发压力增大,造成系统资源使用猛增,最终导致系统不可用。
网络攻击
XSS 攻击,注入攻击,CSRF 攻击
外部灾害
地震,城市断电,火灾等
二、保障系统稳定高可用的方案
解耦设计
高内聚、低耦合的组件设计原则
面向对象基本设计原则
开闭原则(OSP)
依赖倒置原则(DIP)
里氏替换原则(LSP)
单一职责原则(SRP)
接口分离原则(ISP)
面向对象设计模式
开发设计的软件复用能力的解决方案
功能划分:
创建模式 Creational Patterns 对类的实例化过程的抽象
结构模式 Structural Patterns 将类或者对象结合在一起形成更大的结构
行为模式 Behavioral Patterns 对在不同的对象之间划分责任和算法的抽象化、
方式划分:
类模式 以继承的方式实现模式,静态的
对象模式 以组合的方式实现模式,动态的
简单工厂模式
单例模式
适配器模式
模板模式
策略模式
组合(合成)模式
装饰器模式
管道模式
依赖倒置模式
领域驱动设计建模
子域划分
限界上下文
上下文一个映射
隔离
业务与子系统隔离
微服务与中台架构
生产者消费者隔离
虚拟机与容器隔离
异步处理
多线程编程
反应式编程
异步通信网络编程
事件驱动异步架构
备份
集群设计
数据库复制
失效转移
数据库主主失效转移
负载均衡失效转移
设计无状态的服务
幂等支持
事务补偿
传统事务的 ACID
分布式事务的 BASE 原则
通过事务补偿机制,执行业务逻辑逆操作,使事务回滚到事务前状态
重试
远程服务可能会由于线程阻塞、垃圾回收或者网络抖动,而无法及时返还响应,调用者 可以通过重试的方式修复单次调用的故障。
上游调用者超时时间要大于下游调用者超时时间之和。
熔断
当某个服务出现故障,响应延迟或者失败率增加,继续调用这个服务会导致调用者请求 阻塞,资源消耗增加,进而出现服务级联失效,这种情况下使用断路器阻断对故障服务 的调用。
限流
在高并发场景下,如果系统的访问量超过了系统的承受能力,可以通过限流对系统进行 保护。限流是指对进入系统的用户请求进行流量限制,如果访问量超过了系统的最大处 理能力,就会丢弃一部分的用户请求,保证整个系统可用,保证大部分用户是可以访问 系统的。这样虽然有一部分用户的请求被丢弃,产生了部分不可用,但还是好过整个系 统崩溃,所有的用户都不可用要好。
限流的几种算法
1、计数器算法(固定窗口,滑动窗口)
2、令牌桶算法
3、漏桶算法
降级
一些系统功能是非核心的,但是它也给系统产生了非常大的压力,比如说在电商系统 中有确认收货这个功能,即便我们不去确认收货,系统也会超时自动确认收货。
但实际上确认收货这个操作是一个非常重的操作,因为它会对数据库产生很大的压力: 它要进行更改订单状态,完成支付确认,并进行评价等一系列操作。如果在系统高并发 的时候去完成这些操作,那么会对系统雪上加霜,使系统的处理能力更加恶化。
解决办法就是在系统高并发的时候,比如说像淘宝双 11 的时候,当天可能整天系统都处 于一种极限的高并发访问压力之下,这时候就可以将确认收货、评价这些非核心的功能 关闭,将宝贵的系统资源留下来,给正在购物的人,让他们去完成交易。
异地多活
如果整个数据中心都不可用,比如说数据中心所在城市遭遇了地震,机房遭遇了火灾或 者停电,这样的话,不管我们的设计和系统多么的高可用,系统依然是不可用的。
为了解决这个问题,同时也为了提高系统的处理能力和改善用户体验,很多大型互联网 应用都采用了异地多活的多机房架构策略,也就是说将数据中心分布在多个不同地点的 机房里,这些机房都可以对外提供服务,用户可以连接任何一个机房进行访问,这样每 个机房都可以提供完整的系统服务,即使某一个机房不可使用,系统也不会宕机,依然 保持可用。
异地多活的难点是数据一致。
请用你熟悉的编程语言写一个用户密码验证函数,Boolean checkPW(String 用户 ID,String 密码明文,String 密码密文),返回密码是否正确 boolean 值,密码加密算法使用你认为合适的加密算法。
答:采用单向散列算法 MD5,SHA;
评论