高并发架构实践指南——实践概述、前置条件

本文介绍高并发微服务架构系统,以亲自编码实现的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颗逻辑核心
        • 若采购云服务器
          • 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台:实例规格是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