写点什么

week11-homework

用户头像
J
关注
发布于: 2021 年 02 月 07 日

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

A: 不可用原因有:

  1. 硬件故障

  2. 软件 bug

  3. 系统发布

  4. 并发压力

  5. 网络攻击

  6. 外部灾害

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

  1. 架构设计上关注和实现解耦、隔离、异步,使得系统能够高内聚、低耦合,方可易于构建业务与子系统的隔离、微服务与中台架构、生产者与消费者隔离、虚拟机与容器隔离机制,技术实现上也可以更多地参考利用异步方式提高系统可用性。

  2. 备份:通过集群、多副本等方案可以实现系统高可用。

  3. Failover(失效转移):核心是尽量设计成无状态的服务,实现方式有幂等、事务补偿等。

  4. 重试:远程服务可能会由于线程阻塞、垃圾回收或者网络抖动,而无法及时返还响应,调用者可以通过重试的方式修复单次调用的故障。

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

  6. 限流:是指对进入系统的用户请求进行流量限制,如果访问量超过了系统的最大处理能力,就会丢弃一部分的用户请求,保证整个系统可用,保证大部分用户是可以访问系统的。这样虽然有一部分用户的请求被丢弃,产生了部分不可用,但还是好过整个系统崩溃,所有的用户都不可用要好。常见的限流算法有计数器算法、令牌桶算法、漏桶算法。

  7. 服务降级:将一些非核心功能和服务,在高并发压力场景下关闭,为核心服务空出硬件资源。

  8. 异地多活


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



A: 我们不能明文存储用户的密码等敏感信息,应该选用单向哈希方法存储加密后的密码,保证在数据库数据泄露的情况下,攻击者很难低成本破解用户密码。在使用单向哈希方法加密时,要考虑哈希函数的强度,尽量选用 SHA256 及以上强度算法,同时在 hash 内容上进行“加盐”操作,进一步增加攻击者的攻击成本。

// check_password.gopackage main
import ( "crypto/md5" "crypto/sha256" "fmt")
func CheckPassword(id, input, expected string) bool { hash := sha256.New()
s := salt(id) + input + id hash.Write([]byte(s)) hashed := fmt.Sprintf("%x", hash.Sum(nil)) return hashed == expected}
func salt(id string) string { hash := md5.New() hash.Write([]byte(id)) return fmt.Sprintf("%x", hash.Sum(nil))}
复制代码


用户头像

J

关注

还未添加个人签名 2015.06.24 加入

还未添加个人简介

评论

发布
暂无评论
week11-homework