写点什么

架构师 0 期 | 导致系统不可用的那些事儿

用户头像
刁架构
关注
发布于: 2020 年 08 月 27 日
架构师 0 期 | 导致系统不可用的那些事儿
  • 导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。

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



导致系统不可用原因

  1. 最次的一种情况,系统有bug,崩了,服务直接挂了。慢SQL、内存泄露等。

  2. 部署不规范,发布导致系统宕机。比如关闭了一台缓存服务器,造成缓存雪崩,白天系统根本无法重启,只能等到半夜,使用人数少了之后,才能重启成功。

  3. 大规模并发,造成的系统过载。

  4. 服务器配置过低,硬盘满了,比如:日志把硬盘写满了。

  5. 被黑客攻击。 SQL注入,XSS攻击,执行恶意脚本等。

  6. 硬盘老化、机房断电。

  7. 自然灾害,不可抗拒的力量。台风、洪水直接摧毁机房。电缆被挖断等硬件故障。



保障系统高可用的方案

  1. 做好代码设计、评审、review、测试等工作,减少系统bug。

  2. 规范部署流程,部署流程尽量自动化。采用微服务,减少系统直接的耦合。发现问题,及时回滚。避免大面积崩溃,把影响控制在最小范围内。使用负载均衡,如果部分服务器挂了,有其他服务器可以顶上。采用灰度发布等。

  3. 引入系统监控系统,实时监控系统关键指标。如果有负载过高指标计时通知,发邮件、发短信、打电话。及时进行处理。

  4. 根据压测数据,合理进行硬件设备冗余。

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

  6. 使用多机房、多数据中心。

  7. 异地多活。当一个城市的机房有故障,能够切换到另一个城市的机房。



写一个用户密码验证函数

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

public boolean checkPW(String userId, String password, String secretedPassword) {
return Objects.equals(getMd5(userId + password), secretedPassword);
}
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);
}
}



用户头像

刁架构

关注

叫我刁架构 2017.10.25 加入

预备备网红首席架构师,移动端开发者,边缘设计支持者。

评论

发布
暂无评论
架构师 0 期 | 导致系统不可用的那些事儿