写点什么

架构师 0 期 Week11 作业 1

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

导致系统不可用的原因有物理设备问题,如硬件损坏,外部灾害;软件问题,如软件 bug,新版发布时兼容问题;访问压力,如短时高并发;外部攻击等。


要做到高可用架构要从事前防范和事后快速恢复两方面入手。


关于事前防范,需要解决设备问题、自身问题、访问压力和安全四方面问题。对于物理设备问题,要形成服务集群,做到失效转移,实现异地多活,即在不同地点配置数据中心。


对于软件问题,可从架构和管理两方面入手,架构方面做到模块解耦隔离,使各模块职责清晰,易于维护。管理方面做到自动化测试、自动化部署、自动化发布,做好运维监控,及时发现问题。让产品开发迭代带来的影响降至最低。


对于访问压力,首先要实现异步访问来扩大并发能力,在流量过大时要做到服务降级--关停次要服务,限流--把访问放到队列之中,缓解流量对服务器可能造成的损害。


对于物理设备问题要做到面对外部攻击需要做好安全防范,如识别 DDOS 攻击,设置 token 或验证码,阻止 CSRF 攻击,审查用户输入,消除 XSS 和数据库注入攻击等。


关于事后快速恢复,首先要引入重试机制,在服务不可用时自动重试连接,做到服务转移/恢复后第一时间接入,降低对客户的影响。其次是熔断机制,做到及时判断服务失效,做到失效转移,在发现服务失效时将访问转移到未受影响的服务器上。转移后要做到幂等来杜绝重复操作的影响,事务补偿实现业务可回滚。


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

import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.nio.charset.StandardCharsets;
public class CheckPW { public boolean checkPW(String userID, String plainText, String cipherText){ String generatedText = null; try { MessageDigest md = MessageDigest.getInstance("SHA-512"); md.update(userID.getBytes(StandardCharsets.UTF_8)); byte[] bytes = md.digest(plainText.getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); for (byte aByte : bytes) { sb.append(Integer.toString((aByte & 0xff) + 0x100, 16).substring(1)); } generatedText = sb.toString();
} catch (NoSuchAlgorithmException e){ e.printStackTrace(); return false; } return cipherText.compareTo(generatedText) == 0; }}
复制代码


用户头像

Nan Jiang

关注

还未添加个人签名 2019.04.26 加入

还未添加个人简介

评论

发布
暂无评论
架构师0期Week11作业1