架构师训练营第十一周命题作业

用户头像
0x12FD16B
关注
发布于: 2020 年 08 月 26 日

作业一

  • 导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。

导致系统不可用的原因:

  1. 硬件和网络故障

  2. 应用系统的配置错误

  3. 大并发请求造成应用系统过载

  4. 系统 BUG 造成存储层的响应变慢(慢 SQL, 缓存中存在大的 Value 对象, Java 应用的内存泄露造成频繁的 FGC等)

  5. 系统中适用的中间件故障(网关, MQ 等中间件不可用)

  6. 系统漏洞被黑客攻击, 比如 SQL 注入后删除了关键业务表或者数据库, XSS 攻击造成系统的页面执行恶意的脚本

  7. 系统超过容量

  8. 不可抗拒的自然灾害, 如数据中心被破坏, 到数据中心的网络光纤被挖掘机挖断

保证系统高可用的方案有:

  1. 硬件冗余, 避免系统应用集群的单点故障问题

  2. 在一组服务集群中引入负载均衡器, 在版本升级的过程中引入预发环境发现和避免验证系统配置问题

  3. 引入监控系统, 监控系统的关键参数: 应用服务宿主机的负载, 内存, CPU, 硬盘, Linux 服务的 INode 信息; 应用服务的堆栈信息, 线程池信息, Java 进程的 GC 状况, 接口的异常信息, 接口服务的调用链路节点耗时信息, 中间件和数据存储的关键参数等

  4. 在新系统上线的时候做系统性能测试, 得到系统容量的瓶颈, 在监控系统中设置合理的关键参数的预警阈值

  5. 引入应用安全策略, 防止系统被攻击, 比如在网关中引入 Web 应用防火墙, 在 Java 应用数据库访问层适用 PrepareStatement 防止 SQL 注入

  6. 建立多数据中心, 在一个数据中心发生故障时能够切换到另外的数据中心

  7. 在系统过载的时候引入服务的限流和降级的机制防止系统过载

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

思路

  1. 使用单向散列算法对 (用户ID + 明文密码) 计算散列值

  2. 对比密文密码和步骤 1 中计算出的散列值是否相同

代码

private String getMd5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(input.getBytes());
BigInteger number = new BigInteger(1, messageDigest);
StringBuilder hashPhrase = new StringBuilder(number.toString(16));
while (hashPhrase.length() < MD5_HEX_LENGTH) {
hashPhrase.insert(0, "0");
}
return hashPhrase.toString().toUpperCase();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
public boolean checkPW(String userId, String password, String secretedPassword) {
return Objects.equals(getMd5(userId + password), secretedPassword);
}



用户头像

0x12FD16B

关注

还未添加个人签名 2018.01.19 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第十一周命题作业