架构师训练营 1 期 -- 第十一周作业
作业一:
(至少完成一个)
导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。
答:引起系统不可用的原因有很多,包括但不限于:
硬件故障,电源烧坏,内存条松动等。
软件bug。
系统发布时,系统也是不可用的。
并发压力导致的系统资源耗尽或服务等待。
网络攻击,带宽被耗尽或比如DDOS攻击,SOCKET句柄被耗尽。
自然灾害,整个机房被毁坏。
保证系统稳定高可用的方案也有很多,比如:
解耦,降低系统之间的耦合,可以提高系统的可用性。解耦的具体方案包括:高内聚,低耦合的设计原则,面向对象基本设计原则,面向对象设计模式,领域驱动建模等,
隔离,隔离可以降低系统之间的影响。常见的隔离方法包括:业务隔离,子系统隔离。微服务架构,中台架构。生产者与消费者隔离。容器隔离,虚拟机隔离。
备份,当主服务器宕机后,从服务器可以替代主服务器,提高系统可用性。
失效转移,使用备份方案是,重要的是怎样做好失效转移。可以借助zookeeper或者keepalive这样的框架来实现失效转移。
幂等,也是高可用架构需要考虑的问题,有些服务是天生幂等的,比如修改数据库操作。有些则需要考虑幂等,比如转账操作,可以在消息中加入事务ID,确保一个事务只被处理一次。
事务补偿。对于分布式系统中,对于失败的事务,可以执行相应的补偿。具体做法是记录每次事务日志,如果事务不成功,则对之前的操作进行逆操作。
重试,对于服务调用失败,可以适当尝试重试。重试需要确保上游服务超时时间>下游超时时间之和。
熔断,是微服务中的一种架构策略。可以避免服务级联失效。
限流,对服务进行保护,防止系统奔溃。限流的策略有很多种,计数器(固定窗口,滑动窗口),令牌桶,漏桶,自适应限流等。
降级,在系统处于高并发访问时,禁止某些非核心服务。
异地多活。当一个数据中心不可用时,请求会发给其它数据中心。其难点是数据一致。
运维也会影响系统的可用性,从运维的角度,保证系统高可用可以做如下努力:
自动化测试可以极大的降低回归测试的人力成本,自动化测试适合比较稳定的系统。
对于较小的团队,自动化部署反而有优势,可以带来比较好的效果。
为了更好的验证线上产品的正确性,可以创建一个预发布环境,预发布服务器不对外提供服务,却与生产环境配置一样。在系统正式发布之前,先把产品发布到预发布服务器,待验证通过后,在把预发布服务器的代码更新到正式环境。
代码版本管控,有两种代码版本管控的方式。在主干分支上开发,然后创建分支进行发布。或者从主干创建分支分支,开发结束后合并到主干分支,只对主干分支进行发布。一般互联网公司都倾向使用第二种方式,但是也有一个缺点,就是当一个分支开发周期比较长时,会与主干分支有很大区别,解决方案是不断从主干分支拉取最新代码,确保开发分支的代码最新。
灰度发布是每次发布时,只在部分服务器上发布新版本,降低系统升级失败带来的风险。
另外需要对网站性能进行监控,实时获取系统运行状态,尽早发现系统问题。
请用你熟悉的编程语言写一个用户密码验证函数,Boolean checkPW(String 用户 ID,String 密码明文,String 密码密文),返回密码是否正确 boolean 值,密码加密算法使用你认为合适的加密算法。
答:Python代码如下:
运行结果如下:
评论