获得徽章 0
总结了半个多月的系统设计篇,希望有用
评论
会玩code于2022-03-17 23:43发布的图片
评论
会玩code于2022-03-16 22:59发布的图片
2
高可用设计
系统设计
设计原则
design for failure
具体优化方法
故障转移
分类
对等的节点之间直接转移
节点分主节点和备用节点,转移时需要进行主备切换
故障检测机制
心跳
主节点选举
paxos、raft共识算法
系统模块间的超时控制
失败只是瞬时的,但调用延迟会导致占用的资源得不到释放,在高并发情况下会造成整个系统奔溃
如何合理设置超时时间
收集系统之间的调用日志,统计比如说 99% 的响应时间是怎样的,然后依据这个时间来指定超时时间。
降级
关闭整个流程中非核心部分,保证主流程能稳定执行
限流
限制单位时间内的请求量,超过的部分直接返回错误
系统运维
灰度发布
通过线上流量观察代码变更带来的影响
故障演练
对系统中的部分节点/组件人为破坏,模拟故障,观察系统的表现
为了避免对生产系统造成影响,可以先部署另外一套与线上环境一摸一样的系统,在这上面进行故障演练
系统可用性度量
MTBF:两次故障之间的间隔,这个时间越长,系统越稳定
MTTR:故障平均恢复时间,时间越短,故障对用户影响越小
可用性=MTBF / (MTBF+MTTR)
展开
会玩code于2022-03-15 23:56发布的图片
评论
【高并发学习笔记】
处理高并发流量的三种方案:
1. 横向扩展和纵向扩展
纵向扩展:不断提升单节点的处理能力,方案简单,一般在项目初期使用,直接升级硬件解决问题。
横向扩展:采用多节点来处理流量,减少单个节点的压力,需要考虑部分节点故障时整个系统的可用性以及数据的一致性。
2. 使用缓存
3. 异步处理
先将请求丢到消息队列中,快速响应用户,同时也能释放资源来响应更多的用户,消息队列的另一端会去异步处理请求逻辑,处理完后再通知用户成功/失败。
展开
评论
【面试训练】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;
}
};
展开
评论
【面试有感】微信后端一面卒。。。
算法:假设微信支付一天有5亿笔交易,找出交易笔数最高的top 100商户并给出算法的时间复杂度
题目主要是分治+top K思路

剩下的基本都是问项目,这块答的不太好,主要是没表达清楚。

八股文相关的就问了一个乐观锁和悲观锁的应用场景,当时脑子一抽,也没反应过来。
乐观锁主要用于读多写少的场景;悲观锁主要用于写多读少的场景;原因主要是乐观锁在写多的场景下,发生冲突一般会自旋直到写成功,自旋是会消耗cpu的;悲观锁获取失败时会直接休眠,不会占用cpu。
展开
评论
下一页
个人成就
文章被点赞 158
文章被阅读 21,440
掘力值 975
收藏集
0
关注标签
7
加入于