欢乐斗地主分布式系统实践

Posted by jabin on June 10, 2020

一、架构演进

  1. 网状拓扑,直连
  2. 总线拓扑,通过proxy
  3. ServiceMesh。 a. 点对点–sidecar; b. 通信感知其它节点情况
  4. 协议兼容–私有协议tdr gRpc; 加一层,pack, unpack

二、典型问题

CAP, 一致性、可用性 一致性的特征:多数派;多阶段,搜集;不反悔

2.1 并发问题

2.1.1 高并发问题

  1. 机器
  2. 多线程,本身性能
  3. 任务本身。 缓存,削峰填谷cache

2.1.2. 单用户

  1. 增量操作, 顺序无所谓。 但是超时重试会有问题
  2. 串行化 : a) 单个用户的修改操作都给同个进程处理。 本身内部如果有多线程/协程,还要自己搞个处理队列。 b) 问题:容灾;热点(hash,号段);多服务修改
  3. 悲观锁。1) 问题:流程变大,延时; 锁服务可用性; 2) 问题2:解锁请求丢失(自动解锁)->解锁请求延时(丢弃, 唯一的seq);
  4. 乐观锁—写重试带来的排队; 复杂业务,同时该A,B,C, A,B成功了, C版本校验失败, 回滚麻烦
  5. Cache—并发拉数据,缓存到本地,要解决相互覆盖的问题。 标识是否正在拉数据的操作

2.1.3. 多用户

2.2 容灾问题

一致性和可用性的取舍

  1. 无状态化。db服务的抖动,超时等局限。
  2. 有状态,双写。一致性无法严格保证, 可用性高
  3. 有状态,主备同步。 牺牲切换期间(要等主机停干净)的可用性。 主备切换方式:路由; 自动切换
  4. 有状态,一致性协议,paxos, raft

2.3. 事务问题

  1. 原子性
  2. 关键:要幂等/对账。 事务id
  3. 对账。 记录账单, 事务要做n件事情,如果没做完,要补偿。
  4. 与后端的网络抖动。做层cache