高并发缓存队列防止溢出解决方案

article/2025/9/17 5:25:04

目录

  • 1 背景介绍
    • 1.1 设计分析微信抢红包
    • 1.2 红包定时导入缓存队列
  • 2 队列术限流
    • 2.1 高并发场景分析
    • 2.2 队列削峰实战
  • 3 设计原则
    • 3.1 动静分离
    • 3.2 微服务化
    • 3.3 负载均衡
    • 3.4 异步消息
    • 3.5 缓存预热
  • 4 Nginx通过LUA脚本访问RabbitMQ消息队列


1 背景介绍

并发量非常大的系统,例如秒杀、抢红包、抢票等操作,都是存在溢出现象,比如秒杀超卖、抢红包超额、一票多单等溢出现象,如果采用数据库锁来控制溢出问题,效率非常低,在高并发场景下,很有可能直接导致数据库崩溃,因此针对高并发场景下数据溢出解决方案我们可以采用Redis缓存提升效率。

1.1 设计分析微信抢红包

在这里插入图片描述
用户抢红包的时候,我们会分批次发放红包,每次发放红包会先根据发放红包的金额和红包的个数把每个红包计算好,然后存入到Redis队列中,存入到Redis队列后,用户每次抢红包都直接从Redis队列中获取一个红包即可,由于Redis是单线程,在这里可以有效的避免多个人同时抢到了一个红包,类似一种超卖现象。

表结构设计:

CREATE TABLE `money_package` (
`id` int(11) NOT NULL COMMENT '主键ID',
`money` int(11) NOT NULL COMMENT '红包总金额',
`count` int(11) NOT NULL COMMENT '红包数量',
`sort` int(2) DEFAULT NULL COMMENT '发红包顺序',
`type` int(11) DEFAULT '1' COMMENT '红包发放类型 1:延时发放 2:立即发放',
`hasload` int(1) DEFAULT '1' COMMENT '加载位置 1:未加载 2:加载到程序 3:加载到Redis缓存',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.2 红包定时导入缓存队列

在这里插入图片描述
抢红包缓存队列溢出控制
在这里插入图片描述
上面已经实现将红包存入到Redis缓存队列中,用户每次抢红包的时候,只需要从Redis缓存队列中获取即可。

2 队列术限流

2.1 高并发场景分析

用户抢红包的高并发场景下,如果让后端服务器直接处理所有抢红包操作,服务器很有可能会崩溃,就像高铁站如果很多人蜂拥挤进站而不排队,很有可能导致整个高铁站秩序混乱,高铁站服务崩溃,程序也是如此。
普通模式:
在这里插入图片描述
队列术:
在这里插入图片描述
解决大量并发用户蜂拥而上的方法可以采用队列术将用户的请求用队列缓存起来,后端服务从队列缓存中有序消费,可以防止后端服务同时面临处理大量请求。缓存用户请求可以用RabbitMQ、Kafka、RocketMQ、ActiveMQ,我们这里采用RabbitMQ即可。

预备知识:MQ引入项目后的优缺点

2.2 队列削峰实战

在这里插入图片描述
用户抢红包的时候,我们用Lua脚本实现将用户抢红包的信息以生产者角色将消息发给RabbitMQ,后端应用服务以消费者身份从RabbitMQ获取消息并抢红包,再将抢红包信息以WebSocket方式通知给用户。如果想使用Lua识别用户令牌,我们需要引入 lua-resty-jwt 模块,是用于 ngx_lua 和 LuaJIT 的 Lua 实现库,在该模块能实现Jwt令牌生成、Jwt令牌校验,依赖库的地址: https://github.com/SkyLothar/lua-resty-jwt

3 设计原则

3.1 动静分离

1·后台springboot启动微服务模块
2.静态文件分离,nginx直接响应,不要再绕后台应用机器

3.2 微服务化

1·将模块细粒度拆分,微服务化
2·借助docker swarm的容器管理功能,实现不同服务的副本部署,滚动更新
3·在本项目中,api模块就部署了3份,以适应前端的高并发

3.3 负载均衡

1·多个实例之间通过nginx做负载均衡,提升并发性能
2·本项目为大家展示的模块均部署在1台节点。生产环境涉及多台机器,用upstream实现。

3.4 异步消息

1·中奖后,中奖人及奖品信息要持久化到数据库。引入rabbitmq,将抽奖操作与数据库操作异步隔离。
2·抽奖中奖后,只需要将中奖信息放入rabbitmq,并立即返回中奖信息给前端用户。
3·后端msg模块消费rabbitmq消息,缓慢处理。

3.5 缓存预热

1·每隔1分钟扫描一次活动表,查询未来1分钟内将要开始的活动。
2·将扫到的活动加载进redis,包括活动详细信息,中奖策略信息,奖品信息,抽奖令牌。
3·活动正式开始后,基于redis数据做查询,不必再与数据库打交道。

4 Nginx通过LUA脚本访问RabbitMQ消息队列

配置设置:OpenRestry安装

在这里插入图片描述

local strlen =  string.len
local json = require "json"
local rabbitmq = require "rabbitmqstomp"local mq, err = rabbitmq:new()
if not mq thenreturn
endmq:set_timeout(60000)local ok, err = mq:connect {host = "127.0.0.1",port = 61613,username = "guest",password = "guest",vhost = "/"}
if not ok thenreturn
end
ngx.log(ngx.INFO, "Connect: " .. "OK")local msg = {key="value1", key2="value2"}
local headers = {}
headers["destination"] = "/queue/my_queue"
headers["receipt"] = "msg#1"
headers["app-id"] = "luaresty"
headers["persistent"] = "true"
headers["content-type"] = "application/json"local ok, err = mq:send(json.encode(msg), headers)
if not ok thenreturn
end
ngx.log(ngx.INFO, "Published: " .. json.encode(msg))local headers = {}
headers["destination"] = "/queue/my_queue"
headers["persistent"] = "true"
headers["id"] = "123"local ok, err = mq:subscribe(headers)
if not ok thenreturn
endlocal data, err = mq:receive()
if not data thenreturn
end
ngx.log(ngx.INFO, "Consumed: " .. data)
ngx.header.content_type = "text/plain";
ngx.say(data);local headers = {}
headers["persistent"] = "true"
headers["id"] = "123"local ok, err = mq:unsubscribe(headers)local ok, err = mq:set_keepalive(10000, 10000)
if not ok thenreturn
end

nginx配置:

        location /rabbitmq {lua_code_cache off;content_by_lua_file conf/rabbitmq.lua;}

http://chatgpt.dhexx.cn/article/cnyjuGvJ.shtml

相关文章

【2021.12.12】缓冲区溢出利用

文章目录 1.1 实验环境和开发工具1.2 任务描述1.3 分析过程1.4 结论1.4.1 利用漏洞1.4.2 修复漏洞 1.1 实验环境和开发工具 处理器 i5-8300H 内存(RAM) 8G 硬盘 476G 软件环境: Windows 10 开发工具: Visual studio 2019 IDA PRO7.5 1.2 …

本地缓冲区溢出分析

栈溢出是缓冲区溢出中最为常见的一种攻击手法,其原理是,程序在运行时栈地址是由操作系统来负责维护的,在我们调用函数时,程序会将当前函数的下一条指令的地址压入栈中,而函数执行完毕后,则会通过ret指令从栈…

关于缓冲区溢出的对策

从编译器的角度出发 以下两种方法均是编译器采取的关于缓冲区溢出的对策 Stackshield 主要思想是在函数调用之前,将return address的副本保存在一个安全的地方,函数返回时将返回地址与预先保存的返回地址比较,以判断缓冲区溢出是否发生。 …

浅析缓冲区溢出

最近一直在学习缓冲区溢出漏洞的攻击,但是关于这一块的内容还是需要很多相关知识的基础,例如编程语言及反汇编工具使用。所以研究透彻还需要不少的时间,这里简单的做一个学习的总结,通过具体的实验案例对缓冲区溢出进行简要的解析…

缓冲区溢出原理详解

下面将有实例引入缓冲区溢出的介绍&#xff1a; void main() { int i0; int a[]{1,2,3,4,5,6,7,8,9,10}; for(i0;i<10;i) { a[i]0;printf("Hello World!\n");} } 首先&#xff0c;这段代码会出现死循环&#xff0c;为什么&#xff1f;因为数组溢出了&…

C语言 缓存区溢出 3221225725

目录 问题描述解决办法&#xff1a; 问题描述 DEV-C报错 Process exited after 4.03 seconds with return value 3221225725 原因 数组定义的容量太大 - 五十万起步的样子 而且每次循环都会再定义一次&#xff0c;导致缓存区溢出 解决办法&#xff1a; 思路来源&#xff1a…

什么是缓冲区溢出?有什么危害?原因是什么?

缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量&#xff0c;溢出的数据覆盖在合法数据上。 危害有以下两点&#xff1a; 1、程序崩溃&#xff0c;导致拒绝服务 2、跳转并且执行一段恶意代码 原因&#xff1a;造成缓冲区溢出的主要原因是程序中没有仔细检查用…

什么是缓冲区溢出?有说明危害?

缓存溢出 缓存溢出(Buffer overflow) &#xff0c;是指在存在缓存溢出安全漏洞的计算机中&#xff0c;攻击者可以用超出常规长度的字符数来填满-一个域&#xff0c;通常是内存区地址。在某些情况下&#xff0c;这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以…

缓存区溢出的原理分析和防范

1.前言 缓冲区溢出(buffer-overflow)是一种非常普遍、同时非常危险的漏洞&#xff0c;在各种操作系统、应用软件中广泛存在。缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击&#xff0c;轻则可以导致程序失败、系统关机等&#xff0c;重则可以利用它执行非授权指令&#xff0…

缓存溢出

缓存溢出&#xff08;Buffer overflow&#xff09;&#xff0c;是指在存在缓存溢出安全漏洞的计算机中&#xff0c;攻击者可以用超出常规长度的字符数来填满一个域&#xff0c;通常是内存区地址。在某些情况下&#xff0c;这些过量的字符能够作为“可执行”代码来运行。从而使得…

逆向基础:软件手动脱壳技术入门

前言&#xff1a; 大家好&#xff0c;我是周杰伦 这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文&#xff0c;希望能给新学软件逆向和脱壳的童鞋们一点帮助。 1 一些概念 1.1 加壳 加壳的全称应该是可执行程序资源压缩&#xff0c;是保护文件的常用手段。加壳过…

iOS逆向之脱壳工具creakerXI+,最简单、最适合新手的脱壳工具

在学习iOS逆向中&#xff0c;脱壳是必备技能之一&#xff0c;在网上看教程有使用 Clutch 和 dumpdecrypted 但是&#xff0c;不知道 是我操作问题&#xff0c;还是手机版本&#xff0c;以及APP版本更新问题 尝试了几次&#xff0c;都无法成功脱壳 最后在网上看到有大神分享其…

【How2RE】 UPX壳及脱壳方式

0x00 什么是壳 壳是另外在PE文件中包含的代码&#xff0c;并且不影响PE文件正常的执行。而壳也分为很多种&#xff0c;这里从UPX壳开始介绍。 0x01 压缩壳 压缩的分类 压缩的目的就是将体积大的可执行文件缩小的过程。分为损失压缩和非损失压缩两种。损失压缩是指不能100%还…

脱壳(中) 脱壳的方法

那些年我们一起脱过的衣裳&#xff0d;脱壳(中) 珈蓝夜宇 2015/10/29 10:42 0x01 我能在万花从中脱去壳的衣裳!&#xff08;续&#xff09; 3.3ESP定律法 3.3.1ESP定律介绍 ESP定律法是脱壳的利器&#xff0c;是国外友人发现的。有了ESP定律&#xff0c;可以方便我们脱掉大多…

脱壳简单总结

title: 脱壳 date: 2021-07-05 14:37:06 tags: RE 脱壳 1.概述&#xff1a; 1.壳&#xff1a; 一&#xff1a;加壳的目的&#xff1a;为了隐藏程序真正的OEP&#xff08;入口点&#xff09;&#xff0c;防止被破解。 二&#xff1a;加壳软件是一种在编译好可执行文件之后&…

最新乐加固脱壳详细教程(有图有真相)

一、前言声明&#xff1a; 本次破解是基于Xposed Installer框架&#xff0c;具体使用方法请上网查询。假设你已经安装好框架&#xff0c;按照下面的步骤&#xff0c;实现乐加固加固脱壳修复DEX&#xff0c;并且重打包运行。本次选择脱壳的APP是小猿搜题&#xff0c;特此声明&a…

脱壳之简单加密壳

一、简单分析与解密 脱壳最重要的三步&#xff1a;找原始OEP&#xff0c;转存文件&#xff0c;修复文件   压缩壳按照这三步就可以完成脱壳&#xff0c;而加密壳因为对PE文件的信息进行了加密处理&#xff0c;找到OEP只是刚开始&#xff0c;还需要将加密之后的代码、数据进行…

iOS完美脱壳

iOS端IPA脱壳 背景&#xff1a;在软件安全领域中&#xff0c;我们与黑产做对抗时&#xff0c;不是被动防守&#xff0c;自己也可以做攻击方&#xff0c;来验证我方软件是否安全。 关于iOS端逆向分析如&#xff1a;虚拟定位、虚拟设备、修改内存等&#xff0c;始终离不开脱壳。…

脱壳工具:Youpk的使用详解

一. Youpk概述 Youpk基于ART的主动调用的脱壳机&#xff0c;主要针对dex整体加固和各式各样的dex抽取加固。 目前 Youpk 只支持 pixel 1代。所以必须需要 pixel 1代手机&#xff0c;而且需要刷入对应的系统。 Youpk可以处理大部分的加固&#xff0c;一些企业版的加固也能处理…

使用upx脱壳工具脱壳

使用upx脱壳工具脱壳&#xff08;攻防世界新手第七题为例simple-unpack&#xff09; 查壳工具链接&#xff1a;https://www.52pojie.cn/thread-437586-1-1.html 脱壳工具链接&#xff1a;https://github.com/upx/upx/releases 先查壳 一般做到逆向的部分题的时候&#xff0c…