技术组件
系统设计 · 16 篇笔记
- 3.1 如何设计一个TCP框架historical
1. 需求文档 2. 设计 2.1. 实体关系图 2.2. 类图 3. 实现 3.1. 时序图 3.1.1. 建立连接 3.1.2. 消息处理 4. C10K C10K.md
- 3.3 如何设计一个缓存中间件historical
1. 什么是缓存中间件 - 通用缓存的基础设施 2. 为什么需要缓存中间件 - 为应用层屏蔽缓存的读写、并发安全、缓存淘汰、分布式支持等细节 3. 如何设计缓存组件 3.1. 基本读写 - 比如HashMap能实现O(1)的读写效率 3.2. 并发安全 多线程同时读写缓存会出问题,如何解决? 3.2
- 3.4 如何设计TCP连接池historical
1. 什么是TCP连接池 复用TCP Connection的池子 2. 为什么需要TCP连接池 如何设计池化技术.md - 创建TCP连接需要三次握手,关闭连接需要四次挥手,开销大 - TCP连接数量是有限制的。高并发下主动关闭的一方进入TIME WAIT会耗尽连接数TCP time wait.md
- 3.5 如何设计一个RPC框架historical
1. 什么是RPC - 远程过程调用 - 是一个计算机通信协议 - 这种协议使得client可以像调用本地函数一样去调用server上的函数,即屏蔽了网络通讯的细节 - 采用C/S模式,经典实现是request-response 1.1. 本地函数调用 vs RPC - 本地函数调用:不需要经过网络
- 3.6 如何设计一个限流系统historical
1. 什么是限流 - 高并发系统的三大利器之一,限制访问速率(区别于Semaphore限制的是访问数量) - 技术层面的限流:服务A调用服务B,服务B为了防止请求量过大,限制访问速率 - 业务层面的限流:限制某人每天只能使用n次 2. 为什么需要限流 - 后端服务的处理能力是有限的,如果突发流量暴增
- 3.7 如何设计开放API接口historical
1. 什么是开放接口 一般的API只对内部系统开放 而开放API则是对外部系统开放,其他系统或者软件可以调用这个API获取本系统的数据 2. 如何设计开放接口 2.1. 安全问题 对于开放接口,主要面临3个安全问题: - 请求身份是否可信任--认证 - 请求的参数是否被篡改--签名 - 请求是否唯一
- 3.8 如何设计异步系统historical
1. 什么是异步处理 - A调用B,不等待结果直接返回 2. 为什么需要异步处理 - 可以增加整个系统的吞吐量 3. 如何设计异步处理 3.1. 事件驱动 事件驱动架构.md 3.1.1. API定义 4. 异步处理的问题 4.1. 一致性 - 消息队列一致性问题.md 搞一个一致性平台,监听业务产
- 3.9 如何设计隔离系统historical
1. 隔离是什么 - 将系统或者资源分割开,在系统发生故障时能限定传播范围和影响范围,避免出现雪崩效应 2. 怎么实现隔离 2.1. 存储隔离 - 比如微服务不同服务的机器以及数据库是隔离的 2.2. 服务隔离 - 多租户模式,中台按APPID隔离一样的道理 2.3. 服务内部资源隔离 - 主调调用
- 3.10 如何设计熔断系统historical
1. 熔断是什么 - 主调调用被调,当错误数达到阈值时不再调用被调,好转则恢复调用 - 容错策略中的Failfast 2. 如何实现熔断 2.1. 断路器模式 - - 通过代理(断路器对象)来一对一地(一个远程服务对应一个断路器对象)地接管服务调用者的远程请求 - 服务A调用服务B,A会统计错误,当
- 3.11 如何设计降级系统historical
1. 降级是什么 - 降级是一种兜底方案,在 系统出故障后 尽力而为的措施 - 相比起限流、熔断偏向技术,这个偏向业务层面 2. 什么时候需要降级 - 压测了解系统QPS,当实际QPS大于系统QPS时需要降级 3. 对什么进行降级 - 核心链路还是非核心链路,降级之后的影响 4. 怎么降级 4.1.
- 3.12 如何设计超时与重试系统historical
1. 超时重试是什么 - 超时:服务A调用服务B,为了防止服务A请求服务B但是一直没有响应,导致服务A的线程等资源一直hold着无法释放,因此需要设置超时 - 重试:服务A调用服务B,如果服务A请求服务B发生了网络错误,那么会触发超时,但是这个网络是暂时的,因此重试几次可能就好了 2. 怎么设计超时
- 3.14 如何设计开关系统historical
1. 什么是开关 就是一个bool配置 2. 为什么需要开关 通过开关把一些不重要的服务给停掉或者将功能状态在不同版本之间进行切换 3. 如何实现开关 如何设计配置中心.md
- 3.15 如何设计预案系统historical
1. 什么是预案 可以理解为让业务整体进入某个预先设置好的场景 2. 为什么需要预案 人工修改一个个开关太繁琐并且容易出错 3. 如何实现预案 多个开关策略的串行执行
- 3.18 如何设计池化技术historical
1. 什么是池化技术 预先创建对象并存放到池子里,使用的时候从池子中获取对象而不是创建,使用结束把对象归还给池子而不是销毁 2. 为什么需要池化技术 - 频繁创建、销毁对象开销大 - 对象占用资源多,需要限制对象的数量否则会把资源耗尽 3. 池化技术的缺点 池化技术属于利用空间换时间,所以会消耗内存
- 3.19 如何设计缓存系统historical
1. 什么是缓存 CPU和磁盘的速度差异巨大,一般会根据局部性原理把常用的数据加载到内存中,以提高访问速度 2. 为什么需要缓存 - 提高性能 - 降低下游负载 3. 缓存的缺点 3.1. 缓存一致性 - CAP原则下延迟导致的一致性是没办法解决的,只能保证最终一致性 - 如果是read-throu