笔者想建立自己的后端技能树,以并发量的增长为线索,构建后端开发技能树。
单机架构
这里先介绍单机架构是什么?
基础
刚开始,需要做一个简单的服务器,因此首要任务是做出一个简单的服务器。
技能:
- 网络编程: 使用socket编程, 熟悉TCP/IP协议, 熟悉HTTP/HTTPS协议
- 数据库: 看懂sql语句,知道如何使用语言的api操作数据库
- 测试: 知道如何进行单元测试、集成测试、压力测试
- 运维: 知道如何部署服务器,如何配置服务器,如何监控服务器
进阶
由于经济条件不允许,只能使用一台服务器,现在并发量增长,如何对一台服务器进行优化,提高并发量?
技能:
- 多线程: 熟悉多线程编程,熟悉线程池,熟悉线程安全
- 高级IO(IO多路复用, 异步IO, 零拷贝)
- 高性能网络模式(Reactor, Proactor)
- 数据库:索引优化
应用数据分离架构
应用服务集群架构
我们的系统受到了用户的欢迎,并且出现了爆款,单台应用服务器已经无法满足需求了。我们的单机应用服务器首先遇到了瓶颈,摆在我们技术团队面前的有两种方案,大家针对方案的优劣展示了热烈的讨论:
垂直扩展/纵向扩展ScaleUp。通过购买性能更优、价格更高的应用服务器来应对更多的流量。这种方案的优势在于完全不需要对系统软件做任何的调整;但劣势也很明显:硬件性能和价格的增长关系是非线性的,意味着选择性能2倍的硬件可能需要花费超过4倍的价格,其次硬件性能提升是有明显上限的。
水平扩展/横向扩展ScaleOut。通过调整软件架构,增加应用层硬件,将用户流量分担到不同的应用层服务器上,来提升系统的承载能力。这种方案的优势在于成本相对较低,并且提升的上限空间也很大。但劣势是带给系统更多的复杂性,需要技术团队有更丰富的经验。
如果采用水平扩展,技能要求:负载均衡
- 负载均衡: 熟悉负载均衡的原理,熟悉负载均衡的算法,熟悉负载均衡的实现
- 服务注册与发现:etcd
- 集群间通信:grpc, protobuf
- 配置中心
- 会话管理:由session管理变为token管理
- 发布策略
- 灰度发布(金丝雀发布)
- 蓝绿发布
- 滚动发布
- 版本控制
- 自动化发布
- 回滚机制
读写分离/主从分离架构
随着访问量继续增加,发现业务中一些数据的读取频率远大于其他数据的读取频率。我们把这部分数据称为热点数据,与之相对应的是冷数据。针对热数据,为了提升其读取的响应时间,可以增加本地缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的html页面等。通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用memcached作为本地缓存,使用Redis作为分布式缓存,还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题。
技能:引入缓存
- redis: 熟悉redis的api,熟悉redis的持久化,熟悉redis的集群
- 缓存一致性: 熟悉缓存一致性问题,熟悉缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题