🚀 前端狂欢—电商高并发:秒杀 抢购 库存同步...

什么

什么是高并发❓❓❓

可能不知道啥是高并发,但互联网时代,或多或少参与过秒杀抢票促销的功能等活动。恰恰这些应用场景,即是高并发+性能优化的重中之重。

高并发的特征

瞬时流量巨大 :活动开始时可能涌入数十万甚至百万用户
操作集中性强 :用户行为高度一致(如点击同一个按钮)
响应要求极高:用户对延迟极其敏感,几百毫秒的延迟可能导致失败

怎么做(重要)

秒杀

秒杀活动开始前,成千上万的用户同时进入页面,如果JSCSS图片等静态资源加载缓,就会导致核心秒杀模块展现延,严重影响用户体验。

1. CDN分发与缓存策略

  • 全球分布式CDN:将静态资源部署到离用户最近的边缘节点

  • 多级缓存策略

    html 复制代码
    <!-- 文件名嵌入哈希值实现精确缓存控制 -->
    <link rel="stylesheet" href="styles.a1b2c3.css">
    <script src="app.d4e5f6.js"></script>
  • 缓存头优化: Cache-Control: public, max-age=31536000, immutable

2. HTTP/2多路复用

  • 单连接多请求,减少TCP握手开销
  • 服务器推送关键资源

3. 资源预加载与预连接

html 复制代码
<!-- DNS预解析 -->
<link rel="dns-prefetch" href="//cdn.example.com">

<!-- 关键资源预加载 -->
<link rel="preload" href="/critical.css" as="style">

抢购

"立即抢购"按钮被疯狂点击时,短时间内大量相同请求涌向服务器,可能导致接口崩溃。

1. 防抖与节流

防抖(Debounce) :高频操作后只执行一次(如搜索框)
节流(Throttle):固定间隔执行一次(如抢购按钮)

2. 请求队列与优先级控制

javascript 复制代码
class RequestQueue {
  constructor(maxConcurrent = 5) {
    this.queue = []
    this.activeCount = 0
    this.maxConcurrent = maxConcurrent
  }

  add(requestFn) {
    return new Promise((resolve, reject) => {
      this.queue.push({ requestFn, resolve, reject })
      this.next()
    })
  }

  next() {
    if (this.activeCount >= this.maxConcurrent || !this.queue.length) return
    
    const { requestFn, resolve, reject } = this.queue.shift()
    this.activeCount++
    
    requestFn()
      .then(resolve)
      .catch(reject)
      .finally(() => {
        this.activeCount--
        this.next()
      })
  }
}

// 全局请求队列实例
const apiQueue = new RequestQueue(3)

// 封装秒杀请求
function seckillRequest(data) {
  return apiQueue.add(() => axios.post('/api/seckill', data))
}

抢购页面优化

秒杀页面包含大量内容,但只有核心抢购模块需要第一时间展示。

1. 代码分隔

将代码拆分为核心模块(首屏关键代码)和非核心模块(如弹窗、二级页面),按需加载 。抢购页面的核心逻辑(如倒计时、立即购买按钮)需优先加载,而辅助功能(如订单详情、优惠券列表)可延迟加载

javascript 复制代码
// 动态导入(Dynamic Import),非核心模块按需加载
const CouponModal = React.lazy(() => import('./CouponModal'));  

// 使用 Suspense 包裹懒加载组件
<Suspense fallback={<Spinner />}>
  <CouponModal />  
</Suspense>

2. 懒加载/预加载/长列表

延迟加载非关键资源(如图片、辅助组件),触发条件包括滚动、点击等交互行为。

javascript 复制代码
// 图片懒加载(IntersectionObserver API)
const imgObserver = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const lazyImg = entry.target;
      lazyImg.src = lazyImg.dataset.src; // 替换 data-src 为真实 URL
      imgObserver.unobserve(lazyImg);
    }
  });
});

document.querySelectorAll('img.lazy').forEach(img => imgObserver.observe(img));

提前加载后续可能需要的资源(如抢购确认页的 JS/CSS)

用link的preload<link rel="preload" href="qianggou.js" as="script" />

可自行实现,也可用一些库。

大型虚拟列表优化:就渲染用户视口中能看到的部分就行。

1、vue 用 vue-virtual-scroller

2、react 用 react-windowreact-virtualized

只渲染可见的元素,滚动时动态加载,提高性能!

倒计时/同步库存

1.webSocket

替代HTTP轮询(减少无效轮询),开一个webSocket持久连接,秒级抢购和同时👍。

js 复制代码
const socket = new WebSocket('wss://example.com/seckill');

// 心跳检测防止连接断开
const heartbeatInterval = setInterval(() => {
  if (socket.readyState === WebSocket.OPEN) {
    socket.send(JSON.stringify({ type: 'ping' }));
  }
}, 30000);

socket.onmessage = (event) => {
  const { stock, countdown, userQueue } = JSON.parse(event.data);
  
  // 使用虚拟DOM更新避免重绘(性能关键!)
  requestAnimationFrame(() => {
    document.getElementById('stock').textContent = `库存:${stock}`;
    document.getElementById('countdown').textContent = `倒计时:${countdown}s`;
    renderQueue(userQueue); // 更新用户排队位置
  });
};

2.SSE(Server-Sent Events)

后端做sse接口。

前端要打开连接,创一个EventSource对象。

js 复制代码
const eventSource = new EventSource('/sse');

eventSource.onmessage = (event) => {
  // 做逻辑代码
}

3. Web Worker

将复杂的计算逻辑,交给web workder,避免堵塞。

javascript 复制代码
// main.js
const worker = new Worker('compute.worker.js')

// 复杂任务分发
function processBigData(data) {
  return new Promise((resolve) => {
    worker.postMessage(data)
    worker.onmessage = (e) => resolve(e.data)
  })
}

// compute.worker.js
self.onmessage = function(e) {
  const result = heavyComputation(e.data)
  self.postMessage(result)
}

function heavyComputation(data) {
  // 复杂计算逻辑
  return processedData
}

总结

静态资源 :CDN+缓存+预加载 → 加速首屏
请求控制 :防抖+节流+队列 → 避免崩溃
加载策略 :代码分割+懒加载 → 按需加载
实时同步 :WebSocket+SSE → 毫秒级更新
性能保障 :Web Worker → 主线程不卡顿

相关推荐
QQ1__8115175154 小时前
Spring boot名城小区物业管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
钛态4 小时前
前端微前端架构:大项目的救命稻草还是自找麻烦?
前端·vue·react·web
一粒黑子4 小时前
【实战解析】阿里开源 PageAgent:纯前端 GUI Agent,一行JS让网页支持自然语言操控
前端·javascript·开源
独角鲸网络安全实验室4 小时前
2026微信小程序抓包全解析:从实操落地到合规风控,解锁前端调试新范式
前端·微信小程序·小程序·抓包·系统代理绕过·https证书严格校验·进程隔离
紫微AI4 小时前
前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了
前端·人工智能·typescript
GISer_Jing4 小时前
AI前端(From豆包)
前端·aigc·ai编程
IT枫斗者4 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
测试修炼手册4 小时前
[测试技术] 深入理解 JSON Web Token (JWT)
前端·json
AI老李4 小时前
2026 年 Web 前端开发的 8 个趋势!
前端
里欧跑得慢4 小时前
15. Web可访问性最佳实践:让每个用户都能平等访问
前端·css·flutter·web