关于后端系统架构的思考随笔
// 前端 - > 服务端(网关、具体服务) -> 数据层
个人看了一些书,写了一些代码,也做了一些架构工作。
系统架构可以通过业务
和非业务
两个方面来结合起来考虑。
业务方面:
1. 系统具体提供什么服务
- 具体做哪些业务
- 如何提供服务
2. 业务模块划分
- 处理模块与模块之间的依赖:树性结构、网状结构
- 每个模块是否做到了高内聚、低耦合
3. 外部入口(API或页面)是如何设计的
- 调用是否方便
- 业务流程是否流畅
4. 业务可扩展性
- 能否快速响应新增业务需求,尽量对可能变动的数据做成
- 良好的业务抽象
非业务方面:
1. 可用性:
1.1 服务可用性
- 防单点:核心服务必须多机房部署,每个机房至少保证有2台服务。多个机房的多台机器同时挂掉可能性太小了。
- 系统监控:又分为业务监控和服务器性能监控。业务监控主要是监控服务的TP99、可用率、调用量等;服务器性能监控主要是对服务器心跳、CPU、内存、磁盘、网络做监控,比如CPU利用率,内存利用率及是否吃SWAP,磁盘IO和剩余空间,网络丢包、连接数、重传比率等。当发现问题,还有报警。
- 服务治理:
- 服务熔断降级:Netflix的hystrix是一个可以参考的实现,但是基于命令模式对业务代码的入侵性比较强,所以根据具体业务特点,自己实现一些开关也是能满足需求的。
- 过载保护:类似于信号量的,控制能同时提供服务的并行规模。限速器也能实现此功能。
1.2 数据可用性
- CAP原理
- C:ZK、ETCD、CONSULE
- A:多副本:一主多从架构
- P:多机房,根据域名访问,失效漂移
- 灾备
- 数据离线备份、数据多写
1.3 工程质量:
- 代码Review
- 严谨的发包流程
- 代码合并
- 正式版本和快照版本的区分
- 灰度发布
- 测试质量
- 单元测试
- 自动化测试
2. 安全性
2.1 漏洞性质:
- SQL 注入
- Cookie伪造
- XSS跨站
- CC攻击
- DDOS攻击
2.2 系统权限设计
- 业务数据权限控制
2.3 数据加密
- 对称加密
- 非对称加密(加盐)
3. 性能
3.1 集群负载均衡
- Nginx反向代理
- DNS轮询
- RPC服务轮询
3.2 MQ
- 解耦
- 异步
- 削峰
3.3 缓存
- 堆内缓存
- 堆外缓存
- 一致性哈希缓存
- 分布式主从架构缓存
3.4 代码优化
- 并发
- 算法优化
3.5 吞吐性能
- 大文件分割存储
3.6 JVM层面
- 堆
- GC
3.7 数据库层面
- 索引
- 分库分表