高并发服务器指的是在同一时刻,能够处理海量用户连接和请求的服务器软件。
我们可以拆解这个定义:
高数量巨大,通常是成千上万,甚至百万级别。
并发“发生,注意,这里的“在单核CPU上并不是物理意义上的同时处理,而是通过极快的任务切换,让用户感觉是同时在进行。
服务器提供服务的软件程序。
一个形象的比喻:
普通服务器像一个只有一个收银台的便利店,顾客(请求)需要排队,一个一个结账,如果人多了,队伍就会很长,等待时间很久。
高并发服务器像一个大型超市的几十个收银台,并且有高效的排队系统(比如多个队列或者一个中央排队系统),它能同时为大量顾客服务,大大减少了等待时间。
核心目标:在有限的硬件资源下,尽可能地提高服务器的吞吐量(单位时间内处理的请求数)和降低延迟(每个请求的响应时间)。
当你的服务用户量巨大,或者有瞬时流量高峰时,传统的服务器架构就无法应对了,典型场景包括:
1、电商平台:双十一、618等大促活动,瞬间有数百万用户抢购、下单。
2、社交网络:热点事件爆发时,微博、Twitter等平台会有海量用户同时发帖、刷新。
3、即时通讯:微信、WhatsApp等,需要维持数百万甚至上亿的长连接,同时进行消息收发。
4、在线游戏:大型多人在线游戏(MMO),成千上万的玩家在同一个游戏世界里实时交互。
5、金融支付:春节红包、秒杀等活动,支付系统需要处理极高的并发交易。
如果服务器并发能力不足,用户体验会非常差,直接表现为:网站/App卡顿、无法刷新、提示“服务不可用”或“系统繁忙”,甚至直接崩溃宕机。
实现高并发不是靠某一种“银弹”技术,而是一套综合性的架构和技术组合,其演进历程和核心技术点如下:
1. 基础:高效的网络I/O模型(解决C10K问题的核心)
这是高并发服务器的基石,早期服务器的“一个连接一个进程/线程”模型(如Apache的Prefork模式)在连接数过万时,会因为进程/线程的创建、切换、内存开销过大而崩溃,现代高并发服务器主要采用以下模型:
I/O多路复用这是最关键的技术,用一个单独的进程/线程来“监视”大量的网络连接(文件描述符),当某个连接有数据可读或可写时,才去处理它,这样可以用极少数的线程管理海量连接。
代表技术select
,poll
,epoll
(Linux),kqueue
(BSD/Mac),Nginx和Redis都深度使用epoll。
异步I/O应用发起一个I/O请求后立即返回,去做别的事情,当I/O操作真正完成时,系统会通知应用,这种模式效率最高,但编程模型复杂。
代表技术Linux下的AIO, Windows下的IOCP。
单台服务器的性能总有上限,高并发系统通常采用分布式集群架构。
负载均衡在用户和服务器集群之间,加一个“调度员”(负载均衡器,如Nginx, LVS),它将来自用户的请求按照某种策略(轮询、最小连接数等)分发给后端多台应用服务器,从而将压力分散。
用户请求 -> [负载均衡器 (Nginx/LVS)] -> [服务器A, 服务器B, 服务器C, ...]
池化技术预先创建好一组资源(如数据库连接、线程),用的时候直接取,用完了放回池子,避免频繁创建和销毁的开销,常见的有线程池、数据库连接池。
异步编程在处理一个请求时,如果遇到耗时的操作(如读写数据库、调用外部API),不要“阻塞”等待,而是挂起这个请求,去处理其他请求,等耗时操作完成后再回来继续处理,这能极大提高CPU利用率。
业务逻辑拆分(微服务)将复杂的单体应用拆分成多个小型、独立的服务,每个服务可以独立部署和扩展,比如用户服务、商品服务、订单服务可以分别部署和扩容。
数据库往往是系统的最大瓶颈。
缓存将频繁读取的热点数据放在内存中(如Redis, Memcached),绝大部分的读请求可以直接从缓存获取,极大地减轻数据库压力,这是提升性能最有效的手段之一。
数据库优化
读写分离主数据库负责写操作,多个从数据库负责读操作。
分库分表当单表数据量过大时,将数据拆分到不同的数据库或数据表中。
Nginx高性能的HTTP和反向代理服务器,以其事件驱动和非阻塞I/O模型闻名,擅长处理静态资源和高并发连接,常作为网站的入口和负载均衡器。
Redis内存键值数据库,单线程基于I/O多路复用,速度极快,是缓存的标杆。
Node.jsJavaScript运行时,采用事件驱动、非阻塞I/O模型,非常适合构建高并发的I/O密集型应用(如聊天室、API网关)。
NettyJava领域的高性能网络框架,基于NIO(非阻塞I/O),是构建Dubbo、gRPC、Elasticsearch等众多高性能Java中间件的底层通信框架。
高并发服务器是一个系统工程,它不仅仅是“服务器软件”本身,还包括了负载均衡、缓存、数据库、异步编程等一系列技术和架构的有机结合,其核心思想是:尽可能地减少等待,让CPU和I/O资源永远处于高效的工作状态,并通过水平扩展来突破单机性能瓶颈。
文章摘自:https://idc.huochengrm.cn/js/16355.html
评论