写点什么

极客时间架构师培训 1 期 - 第 11 周作业

用户头像
Kaven
关注
发布于: 2020 年 12 月 05 日
  1. 导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。

一、导致系统不可用的原因

  • 硬件故障

服务器硬盘,内存等损坏等等原因,造成系统崩溃,不可用。

  • 软件 bug

架构设计不合理,程序设计不合理等原因,引起系统 bug,造成系统内存泄漏等问题,造成系统不可用

  • 系统发布

没有规范的发布流程,造成系统发布的失败,造成系统不可用用

  • 并发压力

网站业务的增长,系统承受的并发压力增大,造成系统资源使用猛增,最终导致系统不可用。

  • 网络攻击

XSS 攻击,注入攻击,CSRF 攻击

  • 外部灾害

地震,城市断电,火灾等

二、保障系统稳定高可用的方案

  • 解耦设计

高内聚、低耦合的组件设计原则

面向对象基本设计原则

开闭原则(OSP)

依赖倒置原则(DIP)

里氏替换原则(LSP)

单一职责原则(SRP)

接口分离原则(ISP)

面向对象设计模式

开发设计的软件复用能力的解决方案

功能划分:

  • 创建模式 Creational Patterns 对类的实例化过程的抽象

  • 结构模式 Structural Patterns 将类或者对象结合在一起形成更大的结构

  • 行为模式 Behavioral Patterns 对在不同的对象之间划分责任和算法的抽象化、

方式划分:

  • 类模式 以继承的方式实现模式,静态的

  • 对象模式 以组合的方式实现模式,动态的

简单工厂模式

单例模式

适配器模式

模板模式

策略模式

组合(合成)模式

装饰器模式

管道模式

依赖倒置模式

领域驱动设计建模

子域划分

限界上下文

上下文一个映射

  • 隔离

业务与子系统隔离

微服务与中台架构

生产者消费者隔离

虚拟机与容器隔离

  • 异步处理

多线程编程

反应式编程

异步通信网络编程

事件驱动异步架构

  • 备份

集群设计

数据库复制

  • 失效转移

数据库主主失效转移

负载均衡失效转移

设计无状态的服务

  • 幂等支持

  • 事务补偿

传统事务的 ACID

分布式事务的 BASE 原则

通过事务补偿机制,执行业务逻辑逆操作,使事务回滚到事务前状态

  • 重试

远程服务可能会由于线程阻塞、垃圾回收或者网络抖动,而无法及时返还响应,调用者 可以通过重试的方式修复单次调用的故障。

上游调用者超时时间要大于下游调用者超时时间之和。

  • 熔断

当某个服务出现故障,响应延迟或者失败率增加,继续调用这个服务会导致调用者请求 阻塞,资源消耗增加,进而出现服务级联失效,这种情况下使用断路器阻断对故障服务 的调用。

  • 限流

在高并发场景下,如果系统的访问量超过了系统的承受能力,可以通过限流对系统进行 保护。限流是指对进入系统的用户请求进行流量限制,如果访问量超过了系统的最大处 理能力,就会丢弃一部分的用户请求,保证整个系统可用,保证大部分用户是可以访问 系统的。这样虽然有一部分用户的请求被丢弃,产生了部分不可用,但还是好过整个系 统崩溃,所有的用户都不可用要好。

限流的几种算法

1、计数器算法(固定窗口,滑动窗口)

2、令牌桶算法

3、漏桶算法

  • 降级

一些系统功能是非核心的,但是它也给系统产生了非常大的压力,比如说在电商系统 中有确认收货这个功能,即便我们不去确认收货,系统也会超时自动确认收货。

但实际上确认收货这个操作是一个非常重的操作,因为它会对数据库产生很大的压力: 它要进行更改订单状态,完成支付确认,并进行评价等一系列操作。如果在系统高并发 的时候去完成这些操作,那么会对系统雪上加霜,使系统的处理能力更加恶化。

解决办法就是在系统高并发的时候,比如说像淘宝双 11 的时候,当天可能整天系统都处 于一种极限的高并发访问压力之下,这时候就可以将确认收货、评价这些非核心的功能 关闭,将宝贵的系统资源留下来,给正在购物的人,让他们去完成交易。

  • 异地多活

如果整个数据中心都不可用,比如说数据中心所在城市遭遇了地震,机房遭遇了火灾或 者停电,这样的话,不管我们的设计和系统多么的高可用,系统依然是不可用的。

为了解决这个问题,同时也为了提高系统的处理能力和改善用户体验,很多大型互联网 应用都采用了异地多活的多机房架构策略,也就是说将数据中心分布在多个不同地点的 机房里,这些机房都可以对外提供服务,用户可以连接任何一个机房进行访问,这样每 个机房都可以提供完整的系统服务,即使某一个机房不可使用,系统也不会宕机,依然 保持可用。

异地多活的难点是数据一致。


  1. 请用你熟悉的编程语言写一个用户密码验证函数,Boolean checkPW(String 用户 ID,String 密码明文,String 密码密文),返回密码是否正确 boolean 值,密码加密算法使用你认为合适的加密算法。

答:采用单向散列算法 MD5,SHA;


用户头像

Kaven

关注

还未添加个人签名 2019.04.13 加入

还未添加个人简介

评论

发布
暂无评论
极客时间架构师培训 1 期 - 第 11 周作业