> For the complete documentation index, see [llms.txt](https://yaojun.gitbook.io/cppinterview/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yaojun.gitbook.io/cppinterview/xi-tong-she-ji.md).

# 系统设计

1. 缓存和数据库的一致性问题
2. 集群伸缩问题

### 设计推特

1. [B站视频分享](https://www.bilibili.com/video/BV1Sf4y1e7wc?spm_id_from=333.999.0.0\&vd_source=e9f1ced96b267a4bc02ec41ca31d850a)

### 如何在面试中掌握主动性

1. 当前项目的业务逻辑较为简单，要不你设计一些场景，我讲一下我的解决方案。

### 设计存储架构

1. 估算性能需求（存储量，读写性能）
2. 选择存储系统（TP还是AP）
3. 设计存储方案

### 选择的三要素

1. 合适
2. 简单
3. 演进

### 用户量预估

1. 规划
2. 推算
3. 对比（更同类产品对比）

### 用户行为模型

1. 行为
2. 数量
3. 频率

###

1. 总量50G （冷热数据）
2. 读写请求TPS/QPS 平均值和峰值，两者之差双十一10倍，游戏两三倍。
3. 预留量（线性伸缩）

### SQL

* OLTP
  * mysql
  * postgresql
  * oracle
* OLAP
  * clickhouse
  * hive

### NoSQL

* redis
* mongodb
* es
* influxdb

### 大数据

* flink
* hadoop
* spark
* hdfs
* hbase
* cassandra
* ceph

### 技术本质

1. 应用场景: 游戏服务器用mongodb，论坛服务器用es。
2. 优缺点

### 架构能力

1. 研究成熟开源框架P7以前，展示自己的架构能力
   * ES
   * Redis
2. 架构原理和优缺点

### 架构的复杂度

1. 难度：技术深度和广度：多技术，多领域。
2. 规模：时间，人数。
3. 创新：方法和技巧。

### P6项目能手

1. 理解自己的子系统架构
2. 理解已用子系统架构原理：Redis，MySQL
3. 沟通表达所用技术。（带新员工）

### P6问答

* MySQL用的是什么模式？
  1. 主从
  2. 读写分离
  3. 分库分表
* Redis用的什么数据结构？为什么用这个数据结构？
* 线上服务器有多少台？性能指标大概多少？

### P7团队专家

1. 熟悉上下游
2. 参与端到端的设计
3. 团队相关的开源项目优缺点和原理
4. 子系统的设计和重构

### P7准备技巧

1. Tech学习法（写博客，培训，演讲）
2. 结合业务发展和痛点推动架构升级
3. 链式学习法：自顶向下，逐步深入。

### 服务层

1. 架构解耦
2. 业务降级
3. 异地多活

### 高性能

1. 缓存
2. 异步

### 优势

* Java
* C++
* ES
* InnoDB
* RocksDB
* Redis
* Kafka

### 数据结构

* LSM
* B+
* LRU
* Heap
* Raft
* Skiplist

### 方向

* 分布式
* 数据库
* 服务器
* 数据调度
* ETL

### 数据调度

1. 副本
2. 一致性
3. 事务
4. 伸缩

### C++后台

* 异步IO
* 定时器
* epoll
* 线程池
* 零拷贝
* 锁
* socket

### 高性能

1. 缓存
2. 异步

### 云端DAQ

* 分批上传（start/process/stop）
* 异步线程
* 批量写入
* 缓存策略cache aside更新策略（强一致性2PC和共识算法）

### 数据库设计

1. 读写分离CQRS
2. 分库分表sharding
   * 分表策略：基于租户ID分表
   * 数据访问层的中间件

### 分布式架构

1. 分布式锁
2. 分布式ID
3. 分布式事务
