高并发处理怎么做

wen IT资讯 6

本文目录导读:

高并发处理怎么做

  1. 第一层:流量拦截与前端优化(在请求到达服务器之前)
  2. 第二层:应用层架构优化(核心防线)
  3. 第三层:数据库与存储层优化(最易成为瓶颈)
  4. 第四层:代码与业务逻辑优化
  5. 第五层:监控与运维体系
  6. 一个典型的高并发处理流程示例(秒杀场景):
  7. 核心思想

高并发处理是后端开发和系统架构中的核心挑战,高并发意味着在同一时间或极短时间窗口内,有大量请求涌入系统,要求系统在有限的资源下,依然能提供低延迟高可用的服务。

要解决高并发,不能只靠一个点,而是一个系统性的工程,需要从“流量入口”到“数据存储”层层递进,以下是完整的高并发处理策略,从宏观到微观分为五个层面:

第一层:流量拦截与前端优化(在请求到达服务器之前)

  1. CDN 加速:

    • 目的: 分发静态资源(图片、CSS、JS、视频)。
    • 原理: 将内容缓存到离用户最近的节点,避免所有请求都打到源站服务器。
    • 场景: 电商大促、视频网站、门户首页。
  2. DNS 负载均衡:

    • 原理: DNS 智能解析,将不同地域的用户解析到不同的机房或集群 IP。
    • 优势: 跨机房的流量分发。
  3. 浏览器缓存与页面静态化:

    • 原理: 设置 HTTP 头(如 Cache-Control, Expires)或 Service Worker,让浏览器缓存资源。
    • 场景: 新闻网站、博客,动态生成静态 HTML 页面,减少数据库查询。

第二层:应用层架构优化(核心防线)

  1. 负载均衡(反向代理):

    • 工具: Nginx、HAProxy、F5。
    • 算法: 轮询、最小连接数、IP Hash(保持会话)。
    • 作用: 将海量请求分发到后端的多个应用服务器集群中。
  2. 无状态化与水平扩展:

    • 核心: 将所有会话状态(Session)和用户认证信息从服务器本地内存中移除,存入外部共享存储(如 Redis、Token-based JWT)。
    • 效果: 任意服务器可以处理任意请求,实现“加机器就能提升性能”的水平扩展。
  3. 异步处理与消息队列:

    • 工具: RabbitMQ、Kafka、RocketMQ。
    • 模式: 请求 -> 消息队列 -> 后台 Worker 消费。
    • 场景: 秒杀下单、短信通知、日志记录,先把写请求快速入库(或仅落盘到 MQ),再异步处理,削峰填谷。
  4. 连接池与线程池:

    • 优化: 应用服务器(如 Tomcat、Jetty)与数据库的线程池和连接池。
    • 原则: 线程数并非越大越好,需根据 I/O 等待时间计算最佳值(N = C * (1 + W/S)),使用异步非阻塞模型(如 Netty、WebFlux)提升吞吐量。

第三层:数据库与存储层优化(最易成为瓶颈)

  1. 读写分离:

    • 方案: 一主多从,主库负责写(INSERT/UPDATE/DELETE),从库负责读(SELECT)。
    • 工具: MySQL 主从同步 + 中间层(如 ProxySQL、Mycat)或应用层配置多个数据源。
  2. 分库分表:

    • 场景: 单表数据量超过千万级,索引增大,写入并发高。
    • 策略:
      • 垂直拆分:按业务模块拆分(用户库、订单库)。
      • 水平拆分:按 ID 取模或 Hash 拆分到多个表(user_0, user_1...)。
    • 工具: ShardingSphere、Mycat、TDDL。
  3. 引入 NoSQL 与缓存:

    • 缓存(Redis/Memcached): 将热点数据(用户信息、商品详情、排行榜)放入内存,减少数据库压力,注意缓存穿透、击穿、雪崩
    • 搜索引擎(Elasticsearch): 解决复杂搜索、聚合分析(如商品搜索、日志分析)。
    • 列式存储(ClickHouse): 应对海量数据的实时 OLAP 分析。
  4. 数据库 SQL 与索引优化:

    • 原则: 慢查询日志分析,强制使用索引,避免全表扫描(如 SELECT *%xxx% 模糊查询)。
    • 分页优化: 游标分页(利用 WHERE id > last_id LIMIT 10)替代 Offset 分页。

第四层:代码与业务逻辑优化

  1. 热点数据预加载:

    • 策略: 系统启动或定时任务,提前将热门数据加载到缓存中。
  2. 降级与熔断:

    • 工具: Sentinel、Hystrix、Resilience4j。
    • 策略:
      • 降级: 非核心业务(如“看了又看”推荐)在高峰期直接关闭或返回默认值。
      • 熔断: 当依赖的下游服务(如支付网关)错误率超过阈值,直接短路,快速失败。
      • 限流: 令牌桶、漏桶算法,对单个用户、IP、接口的访问频率进行限制。
  3. 乐观锁与悲观锁的选择:

    • 场景: 秒杀、库存扣减。
    • 推荐: 优先使用 Redis 原子操作(如 DECR)或数据库乐观锁(版本号 CAS),减少行锁冲突。

第五层:监控与运维体系

没有监控的高并发是“盲人摸象”。

  • 全链路追踪: SkyWalking、Zipkin、Jaeger,快速定位请求卡在哪个环节(SQL?RPC?MQ?)。
  • 指标监控: Prometheus + Grafana,观察 QPS、TP99 延迟、CPU/内存/磁盘 I/O、GC 频率。
  • 告警: 当指标超过阈值(如 QPS 飙升至 80% 限流线或 TP99 延迟 > 500ms)自动通知运维。

一个典型的高并发处理流程示例(秒杀场景):

  1. 浏览器端: 点击后按钮变灰(限流),防止重复提交。
  2. CDN(前端): 商品详情页图片已缓存。
  3. 入口(Nginx): 限制单个 IP 的请求速率(例如每秒 5 次)。
  4. 应用层: 请求进入 Lua 脚本或应用代码,首先在 Redis 中判断库存是否充足(DECR),若库存不足,直接拒绝。
  5. 异步写入: 若扣减成功,生成一个“秒杀令牌”,将用户信息与商品 ID 封装成消息发送到 Kafka。
  6. 持久化: 后台 Worker 从 Kafka 消费消息,批量写入数据库订单表。
  7. 返回结果: 异步(通过 WebSocket 或轮询)告知用户秒杀成功。

核心思想

  • 分而治之: 横向扩展、分库分表。
  • 空间换时间: 缓存(内存)、预计算。
  • 时间换空间: 异步处理、消息队列(削峰),这里“空间”指计算资源。
  • 拒绝服务: 降级、熔断、限流,保护系统本身比服务所有人更重要。

也是最关键的: 不要过早优化,先保证代码逻辑正确和业务跑通,通过 压测(JMeter/LoadRunner) 找到瓶颈,再针对性地采用上述策略。

抱歉,评论功能暂时关闭!