一、架构演进
- 网状拓扑,直连
- 总线拓扑,通过proxy
- ServiceMesh。 a. 点对点–sidecar; b. 通信感知其它节点情况
- 协议兼容–私有协议tdr gRpc; 加一层,pack, unpack
二、典型问题
CAP, 一致性、可用性 一致性的特征:多数派;多阶段,搜集;不反悔
2.1 并发问题
2.1.1 高并发问题
- 机器
- 多线程,本身性能
- 任务本身。 缓存,削峰填谷cache
2.1.2. 单用户
- 增量操作, 顺序无所谓。 但是超时重试会有问题
- 串行化 : a) 单个用户的修改操作都给同个进程处理。 本身内部如果有多线程/协程,还要自己搞个处理队列。 b) 问题:容灾;热点(hash,号段);多服务修改
- 悲观锁。1) 问题:流程变大,延时; 锁服务可用性; 2) 问题2:解锁请求丢失(自动解锁)->解锁请求延时(丢弃, 唯一的seq);
- 乐观锁—写重试带来的排队; 复杂业务,同时该A,B,C, A,B成功了, C版本校验失败, 回滚麻烦
- Cache—并发拉数据,缓存到本地,要解决相互覆盖的问题。 标识是否正在拉数据的操作
2.1.3. 多用户
2.2 容灾问题
一致性和可用性的取舍
- 无状态化。db服务的抖动,超时等局限。
- 有状态,双写。一致性无法严格保证, 可用性高
- 有状态,主备同步。 牺牲切换期间(要等主机停干净)的可用性。 主备切换方式:路由; 自动切换
- 有状态,一致性协议,paxos, raft
2.3. 事务问题
- 原子性
- 关键:要幂等/对账。 事务id
- 对账。 记录账单, 事务要做n件事情,如果没做完,要补偿。
- 与后端的网络抖动。做层cache