架构师训练营 1 期 -- 第十一周作业

用户头像
曾彪彪
关注
发布于: 2020 年 12 月 06 日

作业一:

(至少完成一个)

导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。

答:引起系统不可用的原因有很多,包括但不限于:

硬件故障,电源烧坏,内存条松动等。

软件bug。

系统发布时,系统也是不可用的。

并发压力导致的系统资源耗尽或服务等待。

网络攻击,带宽被耗尽或比如DDOS攻击,SOCKET句柄被耗尽。

自然灾害,整个机房被毁坏。



保证系统稳定高可用的方案也有很多,比如:

  • 解耦,降低系统之间的耦合,可以提高系统的可用性。解耦的具体方案包括:高内聚,低耦合的设计原则,面向对象基本设计原则,面向对象设计模式,领域驱动建模等,

  • 隔离,隔离可以降低系统之间的影响。常见的隔离方法包括:业务隔离,子系统隔离。微服务架构,中台架构。生产者与消费者隔离。容器隔离,虚拟机隔离。

  • 备份,当主服务器宕机后,从服务器可以替代主服务器,提高系统可用性。

  • 失效转移,使用备份方案是,重要的是怎样做好失效转移。可以借助zookeeper或者keepalive这样的框架来实现失效转移。

  • 幂等,也是高可用架构需要考虑的问题,有些服务是天生幂等的,比如修改数据库操作。有些则需要考虑幂等,比如转账操作,可以在消息中加入事务ID,确保一个事务只被处理一次。

  • 事务补偿。对于分布式系统中,对于失败的事务,可以执行相应的补偿。具体做法是记录每次事务日志,如果事务不成功,则对之前的操作进行逆操作。

  • 重试,对于服务调用失败,可以适当尝试重试。重试需要确保上游服务超时时间>下游超时时间之和。

  • 熔断,是微服务中的一种架构策略。可以避免服务级联失效。

  • 限流,对服务进行保护,防止系统奔溃。限流的策略有很多种,计数器(固定窗口,滑动窗口),令牌桶,漏桶,自适应限流等。

  • 降级,在系统处于高并发访问时,禁止某些非核心服务。

  • 异地多活。当一个数据中心不可用时,请求会发给其它数据中心。其难点是数据一致。



运维也会影响系统的可用性,从运维的角度,保证系统高可用可以做如下努力:

自动化测试可以极大的降低回归测试的人力成本,自动化测试适合比较稳定的系统。

对于较小的团队,自动化部署反而有优势,可以带来比较好的效果。

为了更好的验证线上产品的正确性,可以创建一个预发布环境,预发布服务器不对外提供服务,却与生产环境配置一样。在系统正式发布之前,先把产品发布到预发布服务器,待验证通过后,在把预发布服务器的代码更新到正式环境。

代码版本管控,有两种代码版本管控的方式。在主干分支上开发,然后创建分支进行发布。或者从主干创建分支分支,开发结束后合并到主干分支,只对主干分支进行发布。一般互联网公司都倾向使用第二种方式,但是也有一个缺点,就是当一个分支开发周期比较长时,会与主干分支有很大区别,解决方案是不断从主干分支拉取最新代码,确保开发分支的代码最新。

灰度发布是每次发布时,只在部分服务器上发布新版本,降低系统升级失败带来的风险。

另外需要对网站性能进行监控,实时获取系统运行状态,尽早发现系统问题。



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





答:Python代码如下:

import hashlib
_USERS = {}
_SALT = '!23$56(*ADd%f5'
def login(username, password):
cipher = get_cipher(password)
_USERS[username] = cipher
print(_USERS)
pass
def check_password(username, password, cipher):
cipher_in_db = _USERS[username]
print('cipher: {}'.format(cipher))
print('cipher in db: {}'.format(cipher_in_db))
return cipher == cipher_in_db
def get_cipher(password):
hash_fun = hashlib.sha256() # 这里可以优化,不必每次都创建has_fun
password = _SALT + password
hash_fun.update(password.encode('utf-8'))
cipher = hash_fun.hexdigest()
return cipher
if __name__ == '__main__':
username = 'test'
password = 'password1'
login('test', 'password1')
cipher = get_cipher(password)
check_result = check_password(username, password, cipher)
print('check password result: {}'.format(check_result))



运行结果如下:





用户头像

曾彪彪

关注

还未添加个人签名 2019.03.23 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营1期 -- 第十一周作业