后端开发系列

后端开发系列

笔者想建立自己的后端技能树,以并发量的增长为线索,构建后端开发技能树。

单机架构

这里先介绍单机架构是什么?

基础

刚开始,需要做一个简单的服务器,因此首要任务是做出一个简单的服务器。

技能:

  1. 网络编程: 使用socket编程, 熟悉TCP/IP协议, 熟悉HTTP/HTTPS协议
  2. 数据库: 看懂sql语句,知道如何使用语言的api操作数据库
  3. 测试: 知道如何进行单元测试、集成测试、压力测试
  4. 运维: 知道如何部署服务器,如何配置服务器,如何监控服务器

进阶

由于经济条件不允许,只能使用一台服务器,现在并发量增长,如何对一台服务器进行优化,提高并发量?

技能:

  1. 多线程: 熟悉多线程编程,熟悉线程池,熟悉线程安全
  2. 高级IO(IO多路复用, 异步IO, 零拷贝)
  3. 高性能网络模式(Reactor, Proactor)
  4. 数据库:索引优化

应用数据分离架构

应用服务集群架构

我们的系统受到了用户的欢迎,并且出现了爆款,单台应用服务器已经无法满足需求了。我们的单机应用服务器首先遇到了瓶颈,摆在我们技术团队面前的有两种方案,大家针对方案的优劣展示了热烈的讨论:

  • 垂直扩展/纵向扩展ScaleUp。通过购买性能更优、价格更高的应用服务器来应对更多的流量。这种方案的优势在于完全不需要对系统软件做任何的调整;但劣势也很明显:硬件性能和价格的增长关系是非线性的,意味着选择性能2倍的硬件可能需要花费超过4倍的价格,其次硬件性能提升是有明显上限的。

  • 水平扩展/横向扩展ScaleOut。通过调整软件架构,增加应用层硬件,将用户流量分担到不同的应用层服务器上,来提升系统的承载能力。这种方案的优势在于成本相对较低,并且提升的上限空间也很大。但劣势是带给系统更多的复杂性,需要技术团队有更丰富的经验。

如果采用水平扩展,技能要求:负载均衡

  1. 负载均衡: 熟悉负载均衡的原理,熟悉负载均衡的算法,熟悉负载均衡的实现
  2. 服务注册与发现:etcd
  3. 集群间通信:grpc, protobuf
  4. 配置中心
  5. 会话管理:由session管理变为token管理
  6. 发布策略
    • 灰度发布(金丝雀发布)
    • 蓝绿发布
    • 滚动发布
    • 版本控制
    • 自动化发布
    • 回滚机制

读写分离/主从分离架构

随着访问量继续增加,发现业务中一些数据的读取频率远大于其他数据的读取频率。我们把这部分数据称为热点数据,与之相对应的是冷数据。针对热数据,为了提升其读取的响应时间,可以增加本地缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的html页面等。通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用memcached作为本地缓存,使用Redis作为分布式缓存,还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题。

技能:引入缓存

  1. redis: 熟悉redis的api,熟悉redis的持久化,熟悉redis的集群
  2. 缓存一致性: 熟悉缓存一致性问题,熟悉缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题

冷热分离架构

微服务架构

Licensed under CC BY-NC-SA 4.0
本站所有文章均为原创,转载请注明出处。
使用 Hugo 构建
主题 StackJimmy 设计