写点什么

架构训练营第十一周作业

用户头像
一期一会
关注
发布于: 2021 年 01 月 03 日

作业一:

第一题


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

解答

导致系统不可用主要有以下几种原因:

  1. 硬件故障。例如内存损坏、硬盘损坏、网络问题等等

  2. 软件 bug。开发的代码中存在漏洞,触发问题时会使一个到多个节点崩溃

  3. 系统发布。系统在发布的时候,原有服务进程会被杀掉。此时就是没有服务的状态,导致不可用

  4. 并发压力。当并发超过了系统承受上限,系统会变慢,甚至崩溃,停止响应

  5. 网络攻击。例如 XSS 攻击,SQL 注入攻击等,被攻击者破坏了服务器,服务停止

  6. 外部灾害。当发生例如火灾、地震等灾害,导致服务器损坏的情况


保障系统稳定高可用的方案:

高可用设计

  • 解耦:贯彻高内聚、低耦合的设计原则,面向对象的设计原则;还可以利用设计模式选型,利用 DDD 进行设计等。

  • 隔离:业务与子系统隔离;微服务部署,中台架构;生产消费者隔离;虚拟机、容器化

  • 异步:利用多线程编程、反应式编程、异步通信、事件驱动异步架构

  • 备份:使用服务器集群;使用数据库复制;结合使用失效转移;

  • 失效转移:包括数据库主主失效转移;负载均衡失效转移;设计无状态服务

  • 幂等:一次调用和多次调用结果相同,保证失效转移能够得到正确结果

  • 事务补偿:在不能幂等的情况下,依靠传统事务的 ACID 特性保证事务;对于分布式事务,可以通过执行业务逻辑的逆操作,实现事务回滚

保障高可用的其他手段

  • 重试:多次重试,可以提高一些因为网络等原因产生的暂时不可用问题的可用性;要注意上游调用者超时时间要大于下游所有调用超时时间之和

  • 熔断:当某个服务出现故障时,为了避免级联失效影响其调用者,进而导致整个系统不可用,可以用断路器阻断对故障服务的调用

  • 限流:当并发大于承受能力时,可以丢弃部分请求,保证整个系统可用;具体的限流算法有计数器算法、令牌桶算法、漏桶算法等;还可以使用自适应限流

  • 降级:在高并发的情况下,可以关闭一些非核心功能(系统降级),保证核心功能的可用

  • 异地多活:在不同地点建立多个数据中心,保证在某地机房不可用的情况下,系统仍然可用


第二题


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

解答

用 Go 语言实现。我设计了 3 个函数,分别是

  1. 由字符串生成 md5 哈希的函数 encryptPW:

func encryptPW(pw string) string {	encryptor := md5.New()	io.WriteString(encryptor, pw)	return fmt.Sprintf("%x", encryptor.Sum(nil))}
复制代码
  1. 使用用户名+明文密码生成密码,并将密码保存入键值字典的 setPW。

func setPW(userName, password string) {
pwHash := encryptPW(userName + password) userPassDict[userName] = pwHash fmt.Printf("set password for %s finished!\n", userName)}
复制代码
  1. 检查用户名,明文密码,密文密码是否对应的 checkPW。

func checkPW(username, pw, pwEncrypted string) bool {	getPW := encryptPW(username + pw)	pwFromDict := userPassDict[username]	return getPW == pwFromDict && pwFromDict == pwEncrypted}
复制代码
  1. 入口 main 函数

var userPassDict map[string]string
func main() { userPassDict = make(map[string]string) u1 := "user1" p1 := "pass1" setPW(u1, p1) u2 := "user2" p2 := "abcdefg123" setPW(u2, p2)
fmt.Println(checkPW(u1, p1, "ca34ff7d9e295155b189c3591f8ca195")) fmt.Println(checkPW(u2, p2, "7f0dbd60a7f96ca5ef9cb61f7c7e18f6"))}
复制代码


作业二:


  • 根据当周学习情况,完成一篇学习总结


解答

整理为以下脑图:

web攻击与防护


加密与解密


高可用,可用性度量


提升高可用的架构方案


发布于: 2021 年 01 月 03 日阅读数: 75
用户头像

一期一会

关注

还未添加个人签名 2018.01.08 加入

还未添加个人简介

评论

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