服务高并发
· 5 min read
后端服务监听端口,客户端发起请求,首先建立 tcp 连接,使用 http 协议。
客户端连接池,连接复用情况。
后端服务接收到请求,立马开启一个 goroutine 处理,这个处理的最大数?
百万请求后端服务会怎样?
1、后端服务现象
1、连接建立失败(握手阶段崩溃)
- 现象:大量浏览器发起 TCP 连接请求后,服务器返回
ECONNREFUSED
错误,或请求超时。 - 原理:
- TCP 半连接队列溢出:服务器的
syn_backlog
队列(存储三次握手未完成的连接)默认大小通常为几百到几千(如 Linux 默认/proc/sys/net/ipv4/tcp_max_syn_backlog
约 1024),100 万并发连接会瞬间填满队列,新连接被直接丢弃。 - 端口资源耗尽:服务器响应连接时需为每个连接分配源端口(范围通常 1024~65535),单台服务器每秒最多创建约 6 万新端口(受限于 TCP 四次挥手的 TIME_WAIT 状态),无法支撑百万级连接。
- TCP 半连接队列溢出:服务器的
2、服务器资源耗尽(CPU / 内存崩溃)
- 现象:服务器 CPU 使用率 100%,内存溢出,服务进程被操作系统 kill(OOM Killer)。
- 原理:
- 线程 / 进程资源爆炸:若服务采用传统 “一连接一线程” 模型(如 Tomcat 默认),100 万连接需 100 万个线程,每个线程默认栈内存约 1MB,仅内存就需 1TB,远超普通服务器配置。
- 上下文切换过载:CPU 忙于线程调度(每次切换需纳秒级开销),实际处理请求的时间被抢占,导致系统 “假死”。
3、文件描述符耗尽(Linux 系统瓶颈)
- 现象:服务抛出
Too many open files
错误,无法接收新连接。 - 原理:Linux 系统每个进程的文件描述符(FD)默认限制约 1024(可通过
ulimit -n
查看),即使调整到百万级(如ulimit -n 1000000
),内核处理百万级 FD 的开销也会导致系统崩溃(如epoll
监听百万 FD 时,事件扫描效率骤降)。
4、 网络带宽瓶颈(流量堵塞)
- 现象:请求响应延迟飙升,大量数据包丢失,浏览器显示 “网络错误”。
- 原理:假设每个请求包大小 1KB,100 万并发请求的入口带宽约为 8Gbps(100 万 ×1KB×8bit),远超普通服务器千兆网卡(1Gbps)的承载能力,导致网络拥塞。
5、下游服务级联故障(数据库 / 缓存崩溃)
- 现象:后端服务依赖的数据库、Redis 等抛出连接拒绝错误,服务整体瘫痪。
- 原理:
- 数据库连接池默认大小通常为几十到几百(如 MySQL 默认
max_connections
约 151),百万级请求会瞬间耗尽连接池,导致 SQL 请求堆积。 - 缓存服务(如 Redis)虽支持高 QPS(单节点 10 万 +),但百万级并发会触发网络超时或请求队列积压,导致缓存失效,进而引发数据库 “雪崩”。
- 数据库连接池默认大小通常为几十到几百(如 MySQL 默认
2、不通架构下差异
1、传统单体架构
- 崩溃速度:秒级内 CPU 和内存耗尽,服务直接退出。
- 根本原因:同步阻塞模型下,连接数与线程数强绑定,资源消耗线性增长。
2、异步非阻塞架构
- 现象:可支撑更高连接数(如 Nginx 单节点可维护 10 万 + 长连接),但请求处理耗时会显著增加(如事件循环队列积压)。
- 瓶颈转移:从线程资源转向 CPU 事件处理能力和网络 I/O 带宽。
3、分布式集群架构(多节点 + 负载均衡)
- 现象:若集群节点数不足(如 10 台服务器),负载均衡器(如 LVS)首先因连接数过载崩溃,或请求被均匀分发后各节点同时耗尽资源。
- 关键限制:负载均衡器自身的连接处理能力(如 LVS 单节点通常支撑 10 万级连接)和集群规模(需至少 100 台节点才可能分散百万请求)。
3、 底层技术限制总结
层面 | 限制因素 | 百万级并发下的瓶颈表现 |
---|---|---|
网络层 | TCP 协议栈处理能力、端口数量、带宽 | 连接握手失败、数据包丢失 |
操作系统 | 文件描述符限制、进程 / 线程资源、CPU 调度 | 无法创建新连接、系统因 OOM 崩溃 |
应用层 | 连接模型(同步 / 异步)、框架并发能力 | 传统框架直接崩溃,异步框架事件循环阻塞 |
存储层 | 数据库 / 缓存连接池、I/O 吞吐量 | 连接池耗尽、磁盘 I/O 被打满 |
4、现实中的防御机制(为何不会真的崩溃?)
- 前端限流:浏览器默认并发连接数有限(如 Chrome 每个域名默认 6 个连接),100 万个浏览器需百万个不同域名或人工修改配置,现实中几乎不可能。
- 中间件防护:负载均衡器(如 Nginx)可配置
limit_conn
限流(如单 IP 限制 100 连接),防止恶意攻击。 - 操作系统优化:调整内核参数(如增大
tcp_max_syn_backlog
、修改 TIME_WAIT 回收策略)可提升连接处理能力,但无法突破硬件极限。
5、百万级并发的本质挑战
百万级浏览器请求的核心问题不是 “后端服务” 本身,而是底层基础设施的物理限制:
- 硬件层面:需万兆网卡、TB 级内存、分布式集群(数百节点)才能支撑;
- 软件层面:需全链路异步架构(如 Nginx + Go + 分布式数据库)和多级限流策略(如网关限流、应用限流、存储限流)