架构师培训第十一周练习
一、导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别例举并简述。
1、导致系统不可用的原因分为两类
(1)计划内宕机
计划内宕机指的是系统在运行阶段不可避免的宕机,包括:
n 系统定期升级维护
n 运行环境基础软件升级
n 运行环境硬件升级
n 数据库数据变更等等
(2)非计划性宕机
非计划性宕机指的是系统出现的故障导致的宕机,包括:
n 应用服务器故障
n 数据库服务器故障
n 硬盘数据丢失和损坏
n 运维人员误操作,比如误删数据等
n 突发超大访问流量导致系统崩溃
n 网络故障,机房断电等
2、保障系统的高可用方案
(1)解耦
采用“高内聚、低耦合”的思想进行系统设计,通过领域驱动进行模型设计、面向对象的组件设计原则、模型对象的设计模式等,使系统易扩展、易维护、易运维从而达到系统高可用。系统的设计和代码的质量是系统能否高可用很重要的因素。
(2)隔离
隔离按级别可以分为线程池隔离、进程隔离、模块隔离、应用隔离、机房隔离。通过不同的隔离手段,使系统某个部分出现故障时,不会影响整个系统的运行,系统可以持续对外提供服务。
(3)限流
系统的处理能力有限,当突发情况,服务请求量超过处理能力,造成响应时间迅速提升,甚至系统崩溃而无法响应。因此,为了保证系统在遭遇突发流量时,能够正常运行,需要服务加上限流。常见的限流算法有:漏桶、令牌桶、滑动窗口计数。
(4)备份和失效转移
备份和失效转移是常用的高可用手段,应用服务器集群、数据库备份、磁盘备份等等,当某个节点故障、通过失效转移启用另一个备份节点、剔除故障节点,保障系统高可用。
(5)降级
业务降级,是指牺牲非核心的业务功能,保证核心功能的稳定运行。将核心和非核心功能实现拆分到相对独立的不同代码单元,分优先级进行隔离。在后台通过开关控制,降级部分非主流程的业务功能,减轻系统依赖和性能损耗,从而提升集群的整体吞吐率。
(6)熔断
当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护自己以及系统整体的可用性,可以暂时切断对下游服务的调用,保障系统可用性,当下游服务恢复正常时,上游服务恢复对下游系统的访问。
(7)异地多活
但在一些极端场景下,有可能整个机房出现故障。例如,典型的有机房断电、机房火灾、地震等,而且即使有其他地区的备份,把备份业务系统全部恢复花费的时间也比较长,如果业务期望达到即使在此类灾难性故障的情况下,业务也不受影响,或者在几分钟内就能够很快恢复,那么就需要设计异地多活架构,在不同地理位置上的建立数据中心,部署系统提供业务服务。
二、请用你熟悉的编程语言写一个用户密码验证函数,Boolean checkPW(String 用户 ID,String 密码明文,String 密码密文)返回密码是否正确boolean 值,密码加密算法使用你认为合适的加密算法。
/**
*
* @param id 用户id
* @param pwd 明文密码
* @param ciphertextPwd 密文密码
* @return
*/
public boolean check(String id ,String pwd,String ciphertextPwd){
//采用国密摘要算法SM3(类似MD5)计算pwd明文的密码密码
String sm3pwd = Sm3Encryptor.encrypt(pwd);
//比较计算出的密文密码和传入的密文密码ciphertextPwd是否相等
//不相等返回false
if(!sm3pwd.equals(ciphertextPwd)){
return false;
}
//相等就通过用户id查询数据库中用户的信息,获取账户信息
UserDto user = findUser(id);
//获取保持在数据库中用户的密文密码
String dbpwd = user.getPasswrod();
//比较数据库中用户的密文密码和传入的密文密码ciphertextPwd是否相等
//相等返回true
if(dbpwd.equals(ciphertextPwd)){
return true;
}
return false;
}
评论