本文介绍高并发微服务架构系统,以亲自编码实现的ExpressOrder微服务分布式应用作为示例,全面地阐述架构演进、技术栈选型、资源规划、部署、监控、压测等核心主题。
场景描述
- 业务:用户端创建快递预约订单,每笔订单数据大小约1KB
- 行业:快递物流
- 实现目标:TPS = 10000
- 约束条件
- 最大RTT = 100ms
- 基于阻塞同步模式,我们假设:计算时间/(计算时间+IO时间)=1/(1+4)=0.2
- 基于非阻塞异步模式,我们假设:异步响应时间 = 1ms
- 针对单机存储(内存或硬盘)场景,我们假设的极限是:业务数据大小/物理存储空间实际消耗=业务数据大小/(业务数据大小+业务数据副本大小+业务数据元数据大小)≥1/(1+1+0.5)=0.4
根据以上信息,可以估算出如下结果:
- 网络IO
- 输入流量最高为 10000*1=10 MB/s
- 公网入网带宽配置最大为 10*8=80 Mbps
- 公网出网带宽配置最大为 10*8=80 Mbps
- CPU
- 阻塞式同步通信场景
- 每秒最多需要 个线程,总计200(二进制近似值256)颗逻辑核心或虚拟核心,对应的物理核心[1]总计100(二进制近似值128)颗
- CPU资源规划
- 若采购物理服务器
- 1台
- 双路:2个CPU,规格是128颗逻辑核心
- 2台
- 单路:1个CPU,规格是128颗逻辑核心
- 双路:2个CPU,规格是64颗逻辑核心
- 4台
- 单路:1个CPU,规格是64颗逻辑核心
- 双路:2个CPU,规格是32颗逻辑核心
- 8台
- 单路:1个CPU,规格是32颗逻辑核心
- 双路:2个CPU,规格是16颗逻辑核心
- 16台
- 单路:1个CPU,规格是16颗逻辑核心
- 双路:2个CPU,规格是8颗逻辑核心
- 32台
- 单路:1个CPU,规格是8颗逻辑核心
- 双路:2个CPU,规格是4颗逻辑核心
- 64台
- 单路:1个CPU,规格是4颗逻辑核心
- 双路:2个CPU,规格是2颗逻辑核心
- 128台
- 单路:1个CPU,规格是2颗逻辑核心
- 1台
- 若采购云服务器
- 2台:实例规格是128颗虚拟核心
- 4台:实例规格是64颗虚拟核心
- 8台:实例规格是32颗虚拟核心
- 16台:实例规格是16颗虚拟核心
- 32台:实例规格是8颗虚拟核心
- 64台:实例规格是4颗虚拟核心
- 128台:实例规格是2颗虚拟核心
- 若采购物理服务器
- 非阻塞式异步通信场景
- 每秒最多需要 个线程,总计15(二进制近似值16)颗逻辑核心或虚拟核心,对应的物理核心[2]总计7.5(二进制近似值8)
- CPU资源规划
- 若采购物理服务器
- 1台
- 单路:1个CPU,规格是16颗逻辑核心
- 双路:2个CPU,规格是8颗逻辑核心
- 2台
- 单路:1个CPU,规格是8颗逻辑核心
- 双路:2个CPU,规格是4颗逻辑核心
- 4台
- 单路:1个CPU,规格是4颗逻辑核心
- 双路:2个CPU,规格是2颗逻辑核心
- 8台
- 单路:1个CPU,规格是2颗逻辑核心
- 1台
- 若采购云服务器
- 1台:实例规格是16颗虚拟核心
- 2台:实例规格是8颗虚拟核心
- 4台:实例规格是4颗虚拟核心
- 8台:实例规格是2颗虚拟核心
- 若采购物理服务器
- 阻塞式同步通信场景
- 内存
- 假设订单流量进入系统后,滞留内存的计算周期为1分钟,则需要为此分配的内存下限为10*60=600 MB ,上限为600/0.4=1500 MB=1.5 GB
- 假设订单流量进入系统后,滞留内存的计算周期为5分钟,则需要为此分配的内存下限为10*60*5=3 GB,上限为3/0.4=7.5 GB
- 假设订单流量进入系统后,滞留内存的计算周期为10分钟,则需要为此分配的内存下限为10*60*10=6 GB ,上限为6/0.4=15 GB
- 存储
- 每分钟订单累计数据大小下限为10*60=600 MB ,上限为600/0.4=1500 MB=1.5 GB
- 每小时订单累计数据大小下限为10*3600=36 GB ,上限为36/0.4=90 GB
- 每日订单累计数据大小下限为10*3600*24=864 GB ,上限为864/0.4=2160 GB=2.16 TB
- 每月订单累计数据大小下限为10*3600*24*30=25.92 TB ,上限为25.92/0.4=64.8 TB
- 每年订单累计数据大小下限为10*3600*24*365=315.36 TB ,上限为315.36/0.4=788.4 TB
前置条件
- 平台:Linux
- 操作系统:Ubuntu 18.04.6 LTS (bionic)
- 内核:5.4.0-84-generic
- 架构:CPU = 64-bit, OS = 64-bit
- 虚拟机:VirtualBox 6.1
- 编程语言:Java
- 运行时环境:AdoptOpenJDK-11.0.11+9
[1] 物理核心:默认所有物理核心都允许开启超线程,此时的物理核心与逻辑核心(或虚拟核心)的比值是2