美文网首页
架构师训练营第11周作业 高可用 加密

架构师训练营第11周作业 高可用 加密

作者: 浩哥有料 | 来源:发表于2020-08-26 17:58 被阅读0次

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

    引起系统故障的原因大致可以分为硬件原因、软件原因、外部原因三类。

    • 硬件原因:主要是指基础设施故障,例如硬件故障,包括硬盘、内存、CPU、电源故障等,以及网络故障。
    • 软件原因:主要包括软件bug、并发阻塞、黑客攻击等。
    • 外部原因:主要指不可控因素和不可抗力因素,例如断电、自然灾害、光缆断路、审查限制等。

    保障系统高可用的方案大致分为架构方案、运维方案、监控方案三类。

    架构方案

    • 解耦
      设计高内聚、低耦合的系统组件,遵循面向对象设计原则、设计模式,以领域驱动设计指导领域建模,降低系统复杂度,提升可靠性和故障修复速度
    • 隔离
      从部署上将不同的子系统分离开,使用微服务架构、中间件、容器等技术,从系统层面控制住故障的影响范围。
    • 异步
      通过并发编程、反应式编程、异步通信、消息队列、事件驱动等手段减少系统阻塞的情况,避免由于网络性能的原因带来的系统不可用。
    • 备份
      对特定的子系统和服务进行集群化部署,通过负载均衡分发并发请求,减轻系统的压力。
    • 失效转移
      在备份的前提下,当集群中某台服务器出现故障,需要将流量指向到其他服务器,在数据库集群中还涉及到主服务器的选举。
    • 幂等
      幂等性是设计无状态服务的必要条件,幂等服务在失效后进行重试不会导致数据不一致。
    • 事务补偿
      对于传统的数据库事务应当满足ACID原则,而对于分布式事务应当满足BASE原则,在事务处理失败的时候,需要通过事务补偿,即业务逻辑上的逆操作对事务进行回滚。
    • 重试
      由于阻塞、网络故障等原因造成的短时间请求失败可以通过重试来解决,需要注意上游调用者的超时时间要大于下游调用者的超时时间之和。
    • 熔断
      当某个服务出现故障时,继续调用这个服务会增加系统资源消耗,因此应当使用断路器阻断对该服务的调用。
    • 限流
      在并发量激增的情况下,为了避免系统被压垮,需要对部分请求进行限制,只允许一部分流量进入,这样虽然会对部分用户造成影响,但比整个服务失去响应要好。
    • 降级
      在系统高并发的情况下,可以关闭一些非核心的业务和功能,集中力量保障核心服务的正常运转。
    • 异地多活
      异地多活针对的是整个数据中心不可用,是对数据中心的异地部署,并且每个数据中心都可以独立提供完整服务。

    运维方案

    • 发布
      在发布代码更新的时候,需要关停服务、更新代码、重新启动这几个步骤,因此会造成服务的短时不可用,为了避免对用户造成感知上的影响,就需要在前期以集群+负载均衡的形式进行服务部署,通过调整负载均衡路由,分批下线服务并进行更新、重启,然后再重新上线。
      为了避免某次发布带来问题后需要全盘回滚,通常会采用灰度发布的方式,即分批次地对服务和服务器进行更新,每一批次之间间隔一段时间,上一批次没有出现问题的情况下再进行下一批次。
    • 自动化测试
      为了减少人工测试的繁琐和疏忽,自动化测试技术可以在更新发布后对整个应用进行回归测试,尽可能减少bug流传到生产环境的概率。
    • 持续部署
      按照持续集成、持续交付、持续部署三个步骤逐步搭建起自动化运维流程和系统,只需要极少的人工干预就可以完成代码更新的发布、测试和部署工作,确保系统的质量。

    监控方案

    • 日志收集与分析
      对用户行为、业务操作、系统性能等指标进行实时的数据记录和分析。
    • 自动控制
      根据日志监控和分析结果自动发现故障并执行相应的失效转移、扩容、限流、熔断、降级等操作。

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

    分析

    本题描述中,输入的参数已经包含了密码的密文,因此无需考虑密文的查询或解密过程,只需验证明文加密之后是否与密文一致即可。

    在实际的软件系统中,验证密码这一运算应当在客户端完成,服务端无需知道密码明文是多少,因此题意应当指的是服务端返回查询到的密码密文后,客户端通过相应函数验证用户输入的密码明文是否正确。这样的设计可以确保网络上传输的仅仅只是请求ID和密码密文,明文不会直接在网络上传输,而且全程只需要对密码明文进行加密操作,而无需揭秘操作,因此可以使用单向散列算法来进行加密。但是考虑到“撞库”破解的风险,不能直接使用默认的加密运算,而是需要在运算中设置一些变化。

    代码

    from hashlib import sha256
    
    
    def check_password(uid, password, cipher):
        if encrypt(uid, password) == cipher:
            return True
        return False
    
    
    def str_to_hex(string):
        string_hex = ''
        for i in range(len(string)):
            string_hex += hex(ord(string[i]))[2:]
        return string_hex
    
    def encrypt(uid, password):
        salt = 'magic words'
        combined_string = str(hex(uid)) + str_to_hex(salt) + str_to_hex(password)
        return sha256(combined_string).hexdigest()
    
    
    def test():
        print check_password(155, 'P@ssWord', '1cdf025ea9e37482ea93266570cb4ef5fbd96546bf41e400635493d5d99705ca')
        print check_password(155, '123!@#qweASD', '1cdf025ea9e37482ea93266570cb4ef5fbd96546bf41e400635493d5d99705ca')
    
    
    test()
    
    # 结果:
    # True
    # False
    

    相关文章

      网友评论

          本文标题:架构师训练营第11周作业 高可用 加密

          本文链接:https://www.haomeiwen.com/subject/fkvxsktx.html