高并发抽奖系统优化方案

article/2025/6/24 1:18:17

在这里插入图片描述

引子

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

需求分析

  • 根据用户量和日活情况,估算出并发值在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.hkcw.cn/article/pjaZFUjYbw.shtml

相关文章

【Doris基础】Apache Doris中的Segment详解:存储与查询的核心组件

目录 1 Segment概述 1.1 什么是Segment 1.2 Segment的重要性 2 Segment的物理结构 2.1 Segment文件组成 2.2 列数据存储格式 3 Segment的生命周期 3.1 Segment创建 3.2 Segment合并(Compaction) 3.3 Segment过期与清理 4 Segment与查询处理 4.1 查询中的Segment剪枝…

JAVA中的枚举

代码示例 理论 枚举的行为多态 public enum MyLockStrategy {SKIP_FAST(){Overridepublic boolean tryLock(RLock lock, MyLock prop) throws InterruptedException {return lock.tryLock(0, prop.leaseTime(), prop.unit());}},FAIL_AFTER_RETRY_TIMEOUT(){Overridepublic bo…

电脑驱动程序更新工具, 3DP Chip 中文绿色版,一键更新驱动!

介绍 3DP Chip 是一款免费的驱动程序更新工具,可以帮助用户快速、方便地识别和更新计算机硬件驱动程序。 驱动程序更新工具下载 https://pan.quark.cn/s/98895d47f57c 软件截图 软件特点 简单易用:用户界面简洁明了,操作方便,…

day61—DFS—省份数量(LeetCode-547)

题目描述 有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市…

MySql(十)

目录 准备工作 1)准备一张表 2)插入数据 1.排序 1--asc 升序 2--desc 降序 3--组合排序 2.聚合函数 1.count(字段名) 2.sum(字段名) 3.max(字段名) 4.min(字段名) 5.avg(字段名) 准备工作 1)准备一张表 CREATE table role(roleid INT PRIMAR…

LabVIEW Val (Sgnl) 属性

在 LabVIEW 事件驱动架构中,Val (Sgnl) 属性(Value (Signaling))是实现编程触发与用户交互行为一致性的关键技术。与普通 Value 属性不同,Val (Sgnl) 在修改控件值的同时强制生成值改变事件,确保程序逻辑与 UI 交互保持…

解常微分方程组

Euler法 function euler_method % 参数设置 v_missile 450; % 导弹速度 km/h v_enemy 90; % 敌艇速度 km/h % 初始条件 x0 0; % 导弹初始位置 x y0 0; % 导弹初始位置 y xe0 120; % 敌艇初始位置 y t0 0; % 初始时间 % 时间步长和总时间 dt 0.01; % 时间步长 t_final …

「Java教案」数据类型、变量与常量

课程目标 1.知识目标 能够根据Java基本数据类型的分类、存储规则及适用场景,合理的选择数据类型。能在合适的场景下正确声明和定义变量和常量。能够根据显式和隐式数据类型转换的规则与风险,合理的进行数据类型转换。 2.能力目…

本地部署基于 Kibana 开源搜索引擎 Elasticsearch 并实现外部访问

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。Kibana 是一个开源可视化工具,用于与 Elasticsearch 进行集成,提供大量数据分析。 本文将详细的介绍如何利用 Docker 在本地部署…

【Ollama】windows部署ollama并运行模型

一、Ollama安装 1.下载Ollama 官网&#xff1a;https://ollama.com/ 2.安装 点击下载 安装完成后打开cmd窗口 键盘按住WinR输入cmd 3.Ollama常用指令 指令说明ollama list查看本地已下载的模型列表ollama pull <模型名>下载模型&#xff08;如 ollama pull llama…

Linux入门(十二)服务管理

服务本质就是进程&#xff0c;但是在后台运行&#xff0c;通常会监听某个端口&#xff0c;等等其他的程序来访问 systemctl 管理指令 systemctl [start | stop | restart | reload | status ] systemctl status NetworkManagersystemctl 服务是在/usr/lib/systemd/system 查看 …

在Ubuntu20.04上安装ROS Noetic

本章教程,主要记录在Ubuntu20.04上安装ROS Noetic。 一、添加软件源 sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list二、设置秘钥 …

Linux 库制作与原理

文章目录 1. 库的概念2. 静态库2.1 静态库的制作2.2 静态库的原理 3. 动态库的制作4.ELF文件4.1 ELF文件内容4.2 ELF文件链接与加载 5. ELF与进程地址空间&#xff0c;动静态链接和库5.1 ELF与静态链接5.2 ELF与进程地址空间5.3 ELF与动态链接、动态库5.3.2 动态库5.3.2 动态链…

26考研——文件管理_文件目录(4)

408答疑 文章目录 二、文件目录1、目录的作用与结构1.1、目录的基本概念1.2、目录的组织形式1.2.1、单级目录结构1.2.2、两级目录结构1.2.3、多级&#xff08;树形&#xff09;目录结构1.2.4、无环图目录结构 1.3、目录的实现方式1.3.1、线性列表1.3.2、哈希表 2、文件共享与链…

俄军操作系统 Astra Linux 安装教程

安装 U盘制作 Rufus 写盘工具&#xff1a;https://rufus.ie/ Astra Linux ISO 镜像文件&#xff1a;https://dl.astralinux.ru/astra/stable/2.12_x86-64/iso/ 准备一个8g以上的u盘&#xff0c;打开Rufus写盘工具&#xff0c;选择下载的iso镜像&#xff0c;写入u盘&#xff…

MacOS安装Docker Desktop并汉化

1. 安装Docker Desktop 到Docker Desktop For Mac下载对应系统的Docker Desktop 安装包&#xff0c;下载后安装&#xff0c;没有账号需要注册&#xff0c;然后登陆即可。 2. 汉化 前往汉化包下载链接下载对应系统的.asar文件 然后将安装好的文件覆盖原先的文件app.asar文件…

AI 的早期萌芽?用 Swift 演绎约翰·康威的「生命游戏」

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 你有没有想过&#xff0c;能不能通过简单的规则模拟出生与死亡&#xff1f;「生命游戏」正是这样一种充满魅力的数学模拟系统。这篇文章我们来聊聊它的规则到底有多神奇&#xff0c;并用 S…

系统设计——系统架构分层设计经验

摘要 文章通过对 MVC 三层架构和 DDD 四层架构的深入分析&#xff0c;结合具体的代码示例和项目结构设计&#xff0c;为 Java 开发人员提供了全面的系统架构分层设计经验。在实际项目中&#xff0c;开发人员应根据项目的规模和业务复杂度选择合适的架构模式&#xff0c;并遵循…

Windows下编译zlib

本文记录在Windows下编译zlib的流程。 零、环境 操作系统Windows 11VS Code1.92.1Git2.34.1Visual StudioVisual Studio Community 2022CMake3.22.1 一、编译 1.1 下载代码 git clone https://github.com/madler/zlib.git 1.2 构建 按照下表配置CMake&#xff0c; CMake…

2025年- H61-Lc169--74.搜索二维矩阵(二分查找)--Java版

1.题目描述 2.思路 方法一&#xff1a; 定义其实坐标&#xff0c;右上角的元素&#xff08;0&#xff0c;n-1&#xff09;。进入while循环&#xff08;注意边界条件&#xff0c;行数小于m&#xff0c;列数要&#xff1e;0&#xff09;从右上角开始开始向左遍历&#xff08;比当…