当前位置: 首页 > news >正文

高并发抽奖系统优化方案

在这里插入图片描述

引子

最近接触了一个抽奖的项目,由于用户量比较大,而且第三方提供的认证接口并发量有限,为了保证服务的高可用性,所以对高并限制发有一定的要求。经过一系列研究和讨论,做出了以下一些优化方案。

需求分析

  • 根据用户量和日活情况,估算出并发值在100左右,所以该项目的并发量就当在100上以,初期目标定为600-800

  • 特定页面的并发量不超过300,为了保证不对第三方服务造成访问压力,特将并发控制在150以内

  • 由于奖品数量有限,故得奖时,需要进行并发写入控制,防止奖品超发

实施步骤

前端方面

减少客户端访问次数。
  • 使用CDN对网站的静态资源进行优化,可以答复静态请求次数。

  • 抽奖结果一次性生成。

每个用户有有一次抽奖机会,但只能有一次中奖,其他两次随机弹出推荐产品。所以有一次抽奖中,只需要访问一次服务器的抽奖接口。

  • 使用本地缓存。

将抽奖次数,是否中奖等信息记录在本地,避免超次抽奖和多余的服务器请求。例如,一旦该用户中过将,就不需要再访问服务器抽奖接口。

服务端优化

使用缓存
  • 使用服务端缓存。

将页面和相关数据查询进行缓存,减少数据库访问次数。

部分业务逻辑异步处理

对于不需要实时处理的业务逻辑,压入队列,实现异步处理。例如优惠券的发放。

Nginx 优化
  • 提高 Nginx 处理性能

使用 worker_processesworker_cpu_affinityworker_rlimit_nofileworker_connectionsopen_file_cache等命令,提高nginx的处理性能。

  • Nginx 并发控制。

先看实例,如下:

    limit_req_zone $binary_remote_addr zone=req_ip:10m rate=40r/s; // #每个IP平均处理的请求频率为每秒40次limit_conn_zone $binary_remote_addr zone=conn_ip:10m;limit_conn_zone $server_name zone=conn_server:10m;limit_conn conn_ip 5; // #限制某个IP来源的连接并发数,此处为5个limit_conn conn_server 600; //#限制某个虚拟服务器的总连接数,此处为600个limit_req zone=req_ip burst=5; //小为5的缓冲区, 当有大量请求过来时,超过了访问频次限制的请求可以先放到这个缓冲区内

在这里,限制了每个IP的请求频率,限制了同一IP的并发连接数,限制了服务器的总连接数

  • 使用 Docker 实现负载均衡

配置 nginx, 使用负载均衡

    upstream icontact_pool {server  web:9000    weight=5    max_fails=3 fail_timeout=10s;server  web2:9000   weight=5    max_fails=3 fail_timeout=10s;server  web3:9000   weight=5    max_fails=3 fail_timeout=10s;...}

如上,通过 Docker 启动多个处理请求的服务容器,在 nginx 中配置每个服务的地址,权重等信息,扩大请求的处理能力

  • 其他服务器环境优化

例如,增加服务器配置(CPU,内存,带宽),如果是PHP, 开启 opcache, 并使用较新版本(php7+), 各种依赖尽量使用最新版本。

zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1

参考资料

  • Nginx限制IP并发连接数和请求数的研究
http://www.xdnf.cn/news/750601.html

相关文章:

  • python训练营day40
  • 共享内存-systemV
  • Python应用for循环遍历寻b
  • homework 2025.03.31 chinese(class 3)
  • DeepSeek R1-0528:深度思考能力的重大跃升与技术突破全解析
  • 一文读懂Automotive SPICE
  • Day41 Python打卡训练营
  • 【HW系列】—Windows日志与Linux日志分析
  • 远程线程注入
  • 【PhysUnits】15.5 引入P1后的标准化表示(standardization.rs)
  • Cesium快速入门到精通系列教程一
  • AtCoder AT_abc408_d [ABC408D] Flip to Gather
  • C++ 变量声明(Declaration)和定义(Definition)的区别
  • 【系统配置与部署类】linux系统下的desktop图标文件配置
  • 如何配置国内docker镜像源?
  • leetcode3128. 直角三角形-medium
  • [VMM]现代 CPU 中用于加速多级页表查找的Page‐Table Entry原理
  • 人工智能在智能健康监测中的创新应用与未来趋势
  • could not select device driver ““ with capabilities: [[gpu]]
  • 红外遥控(外部中断)
  • 关于win10系统中环境变量path变成一行显示的问题
  • Vue ①-实例 || 指令
  • Baklib企业CMS全流程管控与智能协作
  • CppCon 2014 学习:Optimization Tips
  • Fine Pruned Tiled Light Lists(精细删减的分块光照列表)
  • Python60日基础学习打卡Day39
  • 痉挛性斜颈带来的困扰
  • PCIE之Lane Reserval通道out of oder调换顺序
  • 2025年- H63-Lc171--33.搜索旋转排序数组(2次二分查找,需二刷)--Java版
  • 基于热力学熵增原理的EM-GAM