
获得徽章 0
- 高可用设计
系统设计
设计原则
design for failure
具体优化方法
故障转移
分类
对等的节点之间直接转移
节点分主节点和备用节点,转移时需要进行主备切换
故障检测机制
心跳
主节点选举
paxos、raft共识算法
系统模块间的超时控制
失败只是瞬时的,但调用延迟会导致占用的资源得不到释放,在高并发情况下会造成整个系统奔溃
如何合理设置超时时间
收集系统之间的调用日志,统计比如说 99% 的响应时间是怎样的,然后依据这个时间来指定超时时间。
降级
关闭整个流程中非核心部分,保证主流程能稳定执行
限流
限制单位时间内的请求量,超过的部分直接返回错误
系统运维
灰度发布
通过线上流量观察代码变更带来的影响
故障演练
对系统中的部分节点/组件人为破坏,模拟故障,观察系统的表现
为了避免对生产系统造成影响,可以先部署另外一套与线上环境一摸一样的系统,在这上面进行故障演练
系统可用性度量
MTBF:两次故障之间的间隔,这个时间越长,系统越稳定
MTTR:故障平均恢复时间,时间越短,故障对用户影响越小
可用性=MTBF / (MTBF+MTTR)展开评论点赞 - 【面试训练】leetcode42. 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
思路:挨个看每个节点能存的水,相加起来即是结果;每个节点能接的水=min(左边的最高,右边最高) - 节点高度
class Solution {
public:
int trap(vector<int>& height) {
int res = 0;
int size = height.size();
vector<int>l_max_memo(size), r_max_memo(size);
// 构建备忘录
l_max_memo[0] = height[0];
r_max_memo[size - 1] = height[size - 1];
for (int i = 1; i < size; i++) {
l_max_memo[i] = height[i] > l_max_memo[i-1] ? height[i] : l_max_memo[i-1];
}
for (int i = size - 2; i >=0; i--) {
r_max_memo[i] = height[i] > r_max_memo[i+1] ? height[i] : r_max_memo[i+1];
}
for (int i = 0; i < height.size(); i++) {
int max_able_height = l_max_memo[i] > r_max_memo[i] ? r_max_memo[i] : l_max_memo[i];
res += (max_able_height - height[i]);
}
return res;
}
};展开评论点赞