写点什么

week 11

用户头像
Geek_2e7dd7
关注
发布于: 2020 年 08 月 24 日

导致系统不可用的原因有哪些?

硬件故障:cpu烧了/磁盘坏了/主板坏了

软件bug:死循环

系统发布:请求被分配到正在启动/下线的机器上

并发压力:并发量超过系统承受能力,接收请求无法处理

网络攻击:DDOS

外界影响:光线挖断了

保证稳定性的方案有哪些?

软件方面:

代码设计上保持简洁,靠封装和抽象降低复杂度,复杂度越低软件出bug的机会越小,出错也容易排查

代码review,上线前自动/人工测试

硬件方面:

设备冗余,保持一个服务有至少一个冗余的备份节点,而且能够在一个节点down掉时承受所有流量的压力

并发:

限流-》把请求量限制在系统承受能力之内,保证承受能力内的请求可以正常处理

熔断-》避免rpc级联失败

降级-》节省不重要的服务占用的资源,留给核心服务使用

异步-》提升应用服务处理能力

消息队列-》削峰填谷,平滑流量,解耦调用发起/处理方

服务最好能够无状态,无状态服务容易扩容缩容

应用服务器前放置负载均衡服务器,应用服务器dow掉提供故障转移能力

对有状态的保持调用方操作幂等,在失效重试时不会产生副作用

对数据库跨分布式事务准备事务补偿方案,可处理事务失败的情况

上游服务超时应该大于下游服务超时之和,且RPC可重试

网络攻击:

使用防火墙

系统发布:

部署时proxy先摘掉一部分机器,停止这些机器上的服务,更新可执行文件/jar包,启动服务,检测成功后再挂到proxy后面接收正常的请求

分批部署,对于回滚慢的服务,上一批机器,观察一段时间再上下一批机器

外界影响:

异地多活,比如在多个城市部署机房



实现密码校验:

单向散列



boolean checkPW(String userId, String password, String encrypted) {
try {
String salted = password + "_" + userId;
byte[] from = salted.getBytes(StandardCharsets.UTF_8);
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] digest = md5.digest(from);
byte[] target = encrypted.getBytes(StandardCharsets.UTF_8);
return Arrays.equals(digest, target);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return false;
}



用户头像

Geek_2e7dd7

关注

还未添加个人签名 2018.11.08 加入

还未添加个人简介

评论

发布
暂无评论
week 11