写点什么

架构 1 期 第十一周作业

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

(1)导致系统不可用的原因有哪些?

硬件故障

硬盘故障、网络故障、光纤故障等

软件bug

软件发布过程中,一些配置参数或数据库的更新不匹配;导致系统不可用;

系统发布

并发压力

高并发的情况下,大量的用户请求到达服务器,产生了大量的线程,大量线程在争夺系统资源,最后把资源耗尽,系统崩溃了,并发产生的压力也可能产生故障,导致系统不可用;

网络攻击

网络攻击,XSS攻击-用户点击包含恶意脚本的链接;SQL注入攻击、CSRF攻击(伪造用户请求)、ERROR CODE(错误回显、攻击者通过堆栈信息找出表名或表结构)、HTML注释(注释的关键信息会在浏览器中显示)、文件上传(上传可执行文件达到攻击目的、)、路径遍历(访问未开放的文件或目录)

外部伤害

不可抗拒的意外灾害,导致机房服务器损毁或者光纤被挖断等外部伤害,导致系统不可用。

(2)保障系统高可用的方案有哪些?

  1. 解耦:降低模块、降低代码的耦合度,有利于提升系统的可用性;

  2. 隔离:通过解耦后的模块或业务子系统,如果能进行一些物理上的隔离,那么其中一个模块不可用了,其他的模块和服务还能正常使用,不受影响,这样也能提高系统的可用性;

  3. 异步:多线程编程,其中某个线程发生了异常,不会导致整个服务异常;异步响应、消息队列,都能提高系统的可用性;

  4. 备份:集群设计,其中一个服务器出了故障不可用了,可以访问集群中的其他服务器;集群的服务器还可以提高性能,缓解高并发压力,提高系统的可用性;

  5. 失效转移:集群中的某个服务器不可用时,需要把对这台服务器的请求转移到其它可用的服务器上,保证用户的请求正确的处理,这样也提高了系统的可用性;

  6. 幂等:服务的重复调用是不可避免的,必须保证服务重复调用和调用一次产生的效果相同,即服务具有幂等性,在设计的时候要考虑服务调用的幂等性;

  7. 事务补偿:通过执行业务逻辑逆操作,使事务回滚到事务前的状态。

  8. 重试:远程服务可能会由于线程阻塞、垃圾回收或网络抖动,而无法及时返还响应,调用者可以通过重试的方式修复单次调用的故障(上游调用者超时时间应大于下游调用者超时时间之和);

  9. 熔断:当某个服务器出现故障,响应延迟或失败率增加,继续调用这个服务会导致调用者请求阻塞,资源消耗增加,进而出现服务级联失效,这种情况下使用断路器阻断对故障服务器的调用。

  10. 限流:在高并发场景下,如果系统的访问量超过了系统的承受能力,可以通过限流对系统进行保护。限流是指对进入系统的用户请求进行流量限制,如果超过了系统的最大处理能力,就会丢弃一部分的用户请求,保证整个系统的可用,保证大部分用户是可以访问系统的,这样比整个系统都不可用要好;

  11. 降级:高并发的压力下,关闭一些非核心系统应用,将宝贵的系统资源留下来,确保核心系统的可用。

  12. 异地多活:分布在多个地点的多机房架构策略,这些机房都可以对外提供服务,用户可以连接任何一个

机房进行访问,每个机房都可以提供完整的系统服务,这样即使某个机房不可用,系统也不会宕机,依然保持可用,异地多活的难点是数据一致。

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





public Boolean checkPW(String userID, String pwd, String encryptPwd) {

return Util.md5(pwd).equals(encryptPwd);

}

//Util.java

public static String Md5(String plainText) {

StringBuffer buf = new StringBuffer("");

try {

MessageDigest md = MessageDigest.getInstance("MD5");

md.update(plainText.getBytes());

byte b[] = md.digest();



int i;

for (int offset = 0; offset < b.length; offset++) {

i = b[offset];

if (i < 0)

i += 256;

if (i < 16)

buf.append("0");

buf.append(Integer.toHexString(i));

}



} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}



// System.out.println(buf.toString());

return buf.toString();// 32位的加密

}



用户头像

haha

关注

还未添加个人签名 2018.04.24 加入

还未添加个人简介

评论

发布
暂无评论
架构1期 第十一周作业