写点什么

架构师训练营 No.11 周作业

用户头像
连增申
关注
发布于: 2020 年 08 月 26 日
  • 导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。

导致系统不可用的原因有以下几个方面:

  • 硬件故障

  • 软件BUG

  • 系统发布问题

  • 并发压力导致

  • 网络攻击

  • 外部灾害。

保障系统高可用,可从以下几方面处理:

解耦

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

  • 面向对象基本设计原则

  • 面向对象设计模式

  • 领域驱动设计建模

隔离

  • 业务与子系统隔离

  • 微服务与中台架构

  • 生产者消费者隔离

  • 虚拟机与容器隔离

异步

  • 多线程编程

  • 反应式编程

  • 异步通信网络编程

  • 事件驱动异步架构

备份

  • 集群设计

  • 数据库主从、失效转移

事务补偿

  • 传统事务ACID

  • 分布式事务的BASE

  • 事务回滚

重试

  • 上游调用者超时时间要大于下游调用者超时时间总和

熔断

  • 断路器三种状态:关闭,打开,半开

限流

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

  • 令牌桶算法

  • 漏桶算法

降级

异地多活



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



Boolean checkPw(String id, String password, String encPassword){
if(encPassword==null){return false;}
return encPassword.equals(MD5.encrypt(id+password));
}
public class MD5 {
public static String encrypt(String data) {
if (data == null || data.length() == 0) {
return null;
}
try {
StringBuilder result = new StringBuilder();
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(data.getBytes(UTF_8));
for (byte b :bytes) {
String hex = Integer.toHexString(b&0xFF);
if (hex.length() == 1)
result.append("0");
result.append(hex);
}
return result.toString();
} catch (Exception e) {
return null;
}
}
}



用户头像

连增申

关注

还未添加个人签名 2020.04.02 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 No.11 周作业