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

高并发秒杀redis + lua + rabbitmq实现(一) mySeckill.lua --商品库存Key local product_stock_key = KEYS[1] --商品购买用户记录Key local buyersKey = KEYS[2] --用户ID local uid = KEYS[3] --校验用户是否重复秒杀 local result = redis.call("sadd" , buyersKey , uid ) if(tonumber(result) == 1) then --初次秒杀 local stock = .. 阅读详情

发现了一个Nginx的LUA脚本:lua-resty-rabbitmqstomp,可以让Nginx通过LUA脚本访问RabbitMQ消息队列,这个脚本是通过stomp协议连接RabbitMQ的stomp适配器,来pub/sub消息的

关于RabbitMQ-STOMP安装使用相关内容可以参见:RabbitMQ STOMP Adapter

关于Nginx-LUA模块安装使用参见:LAMP架构演进到LAMPGC,再演进到LNMLGC

关于STOMP协议相关资料参见这里:

STOMP官方英文协议1.1版

STOMP协议学习与实战-1.1版

STOMP官方英文协议1.2版

STOMP协议说明书-1.2版


nginx配置:

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

rabbitmq.lua源码如下,该脚本简单的实现pub一个消息然后再sub该消息,set_timeout(60000)表示sub消息如果没有消息时等待60S超时

local strlen =  string.len
local json = require "json"
local rabbitmq = require "rabbitmqstomp"

local mq, err = rabbitmq:new()
if not mq then
      return
end

mq:set_timeout(60000)

local ok, err = mq:connect {
                    host = "127.0.0.1",
                    port = 61613,
                    username = "guest",
                    password = "guest",
                    vhost = "/"
                }
if not ok then
    return
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 then
    return
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 then
    return
end

local data, err = mq:receive()
if not data then
    return
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 then
    return
end

具体扩展一下,可以实现推送功能:发送方调用send将消息pub到RabbitMQ,接收方设置一个超时调用subscribe订阅消息(就类似于long polling)


如何解决 Nginx 与消息队列(如 RabbitMQ)的集成问题? Nginx 与 RabbitMQ 的集成虽然充满挑战,但只要我们找准问题,对症下药,就能够实现它们的完美结合。就像一对默契的舞伴,在技术的舞台上跳出精彩的篇章。随着技术的不断发展,相信未来会有更加便捷和高效的集成方式出现。我们也要不断学习和探索,跟上技术的步伐,让 Nginx 和 RabbitMQ 为我们的系统带来更强大的功能和更出色的性能。🎉相关推荐🍅关注博主🎗️带你畅游技术世界,不错过每一次成长机会!📘Nginx 技术专栏🍅优快云-技术社区。 阅读详情

相关推荐

高并发选房系统:Redis Lua原子扣减与MQ异步落库设计

在高并发业务场景下,如何保证资源分配的原子性和数据一致性,是后端架构设计中的核心挑战。无论是秒杀、抢购、活动报名还是房源申请,本质都是对有限资源进行短时高频的并发申请。传统数据库行锁在流量冲击下容易成为瓶颈,而Redis的Lua脚本凭借单线程模型和原子性执行,能够高效解决库存扣减与用户去重问题;再结合消息队列实现削峰填谷,将同步写库转为异步落库,最终通过数据库唯一索引兜底,确保不超卖、不重复、不丢单。本文从业务建模、Redis Lua原子操作、MQ异步落库、压测验证与排错等维度,详细拆解了一个可落地的选房申

weixin_34037173的博客 539

把RabbitMQ作为lua的api

1. 在Centos7 上安装部署RabbitMQ (1)安装erlang环境 打开以下网址: http://www.erlang.org/downloads  下载最新版本的OTP源码: OTP 19.3 Source File (102147031) 解压后,输入: ./configure --prefix=/usr/erlang --without-javac

johnhill_的博客 2297

高并发系统设计:限流、缓存与消息队列实战解析

高并发系统设计是分布式架构中的核心挑战,关键在于平衡性能与稳定性。从技术原理看,流量控制通过漏桶/令牌桶等算法防止系统过载,缓存策略利用内存读写优势提升吞吐量,消息队列则实现服务间异步解耦。在电商秒杀、支付清算等场景中,这些技术能有效应对突发流量、保证数据一致性。本文结合Redis限流实现、多级缓存架构和RabbitMQ优化配置,详细解析如何构建百万级QPS的高可用系统。特别针对缓存击穿、消息积压等生产环境常见问题,给出了包含BloomFilter、延迟双删等在内的完整解决方案。

weixin_30443747的博客 359

NGINX最常用的指令(最全的查询)

NGINX最常用的指令(最全的查询)

huang714的专栏 9723

软考架构师90天冲刺|DAY24·消息队列应用

<think>用户要求根据给定内容生成一篇不超过150字的文章摘要。内容涵盖消息队列核心作用、Kafka/RabbitMQ对比、真题解析和秒杀系统设计等。需要从这些要点中提炼最关键信息,用简洁语言概括。</think>消息队列是软考系统架构师高频考点,核心作用为异步解耦、削峰填谷和可靠性保障。Kafka适合高吞吐场景,RabbitMQ擅长复杂路由。2024年案例分析第10题考查了消息队列在秒杀系统中的设计与消息可靠性、幂等性处理。

Mc、科 29

SpringBoot秒杀系统架构实战:高并发场景下的分层削峰与数据一致性设计

高并发系统设计是后端开发的核心挑战之一,其核心原理在于通过架构手段应对瞬时流量洪峰,保障系统稳定。技术价值体现在通过分层设计、缓存策略和异步处理,在有限的资源下最大化系统吞吐量与可用性。典型的应用场景包括电商秒杀、票务抢购等瞬时高并发业务。本文以SpringBoot和MySQL为基础技术栈,深入剖析了如何利用Redis缓存进行库存预热和原子扣减,并结合消息队列实现异步订单处理,从而有效解决超卖问题,平滑数据库压力,构建一个高性能、高可用的秒杀系统。

weixin_33853827的博客 331

开源了一个lua-rabbitmq的库

我刚开源了一个自己做的简单的lua-rabbitmq库,基于rabbitmq-c,可以直接make编译出一个可用的.so文件,目前的接口写了有限 的一些接口,调用起来和java版的比较像,暂不支持事务,应用举例在README.md写的比较清楚,这里就不重复了, 赶着下班,就写到这里了,欢迎小用并留言指正 :) 交流QQ:292607269 仓库地址: https://github.co...

llzlaowang的博客 719

amqp-client:lua中amqp rabbitmqlib的包装

Lua AMQP客户 用于amqp库的Lua C包装器。 一个用于amqp库的Lua C包装器。 基于: 安装 这块石头依赖librabbitmq库。 为了安装它,请安装以下RPM(> = 0.8): librabbitmq librabbitmq-devel Linux: luarocks install lua-amqp-client 用法示例 使用非常方便,因为已经实现了C AMQP API,所以它只是一个包装器。 没有官方或方便的Lua Rock与Rabbitmq进行交流-希望它会有所帮助。 从源代码构建 它可以使用luarocks内置方法或Makefile来构建。 使用make-运行make并将库(bin / amqp.so)复制到所需位置: make 快速开始 下面是一个小片段,演示了如何使用lua-amqp发布和同步使用消息。 local amqp =

畅购05—— 首页加载方案(nginx+lua+redis)

电商项目——CG1.首页为什么用nginx部署?2.实现步骤(首页广告)3.数据库改变,如何保证实时预热操作? 1.首页为什么用nginx部署? 首页的并发量高,且有些许的变动 tomcat部署可能不是一个很好地选择 所以使用nginx+lua+redis进行预热缓存 2.实现步骤(首页广告) 后台数据通过后台管理系统对mysql中的首页内容(广告等)进行维护。 定义广告内容,表中设计了 position 位置字段 ,标识广告图片的显示位置。 将首页页面部署到nginx中。 通过lua脚本对广告指定位

qq_41544458的博客 281

GROMACS+PLUMED联合安装避坑指南:为什么你的plumed patch总是失败?

本文深入解析GROMACS与PLUMED联合安装中补丁失败的常见原因,并提供详细的避坑指南。针对版本兼容性、环境配置和编译选项等关键问题,给出从源码选择、环境搭建到手动合并补丁的完整解决方案,帮助用户成功整合这两个强大的分子动力学工具,实现增强采样模拟。

weixin_29302047的博客 287

如何适配自定义激光雷达数据到LIO-SAM:解决ring和time参数缺失问题

本文详细解析了如何将非标准激光雷达(如速腾、Livox)适配到LIO-SAM框架中,重点解决ring和time参数缺失问题。提供了从源码修改到通用适配中间件的多层级解决方案,并包含实机测试与性能调优指南,帮助开发者高效完成雷达数据适配。

weixin_42551227的博客 421

黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐

黑马点评完整代码+简历编写+面试重点 ⭐

KNeeg_的博客 4万+

ptrade从零开始学习量化交易第166期【ptrade量化策略研究参考--三个因子挖掘思路】

三个因子挖掘思路

GJ57017_wx的博客 1245

Docker swarm结合Openresty部署rabbitmq集群

Docker swarm结合Openresty部署rabbitmq集群   大家好,年底了,年味儿越来越浓了.2019年的寒冬被定义为未来10年中最好的一年,对于这一说法悲观的人和乐观的人的理解是不一样的.但是不管是寒冬还是盛夏,我们都应该坚持不断的积累和主动的思考.拥抱变化,坚定信心.    简单描述一下我们的需求,就是通过docker 来搭建一套rabbitm...

weixin_34018202的博客 436

深入解析mSATA与mini-PCIE接口的硬件设计要点

本文深入解析mSATA与mini-PCIE接口的硬件设计要点,涵盖信号定义、电源设计、高速信号处理及PCB布局布线等关键内容。通过实战案例和调试技巧,帮助工程师规避常见设计陷阱,提升电路设计效率,特别适合工业控制和嵌入式系统开发场景。

weixin_28741413的博客 315

[ensp报错:USG6000V错误代码45解决方案]

[ensp报错:USG6000V:错误代码45解决] [ensp报错:USG6000V:错误代码45解决] 第一种处理方式: ensp的45错误帮助文档里的解决方法:(这里就不说了,上华为爸爸的图) ensp的45错误:如果你的45错误不是描述的那个,可能是ensp与virtualbox不兼容了。 错误描述:具体表现为在virtualbox里没有vfw_usg的条目,虚拟介质管理器里也没有相应的条目: 就是vfw_usg_vdi这个 这种情况下你把ensp卸载重装多少次都没用,原因在两个软件的兼容

weixin_45456536的博客 3万+

canal_code

canal实现数据同步 需求: 当tb_ad(广告)表的数据发生变化时,远程调用nginx中的lua脚本更新redis中的广告数据。 总流程 1. 发送到rabbitmq 创建监听类监听指定表变化 @CanalEventListener public class BusinessListener { @Autowired private RabbitTemplate rabbitTemplate; // 指定数据库, 表 @ListenPoint(schema = "ch

weixin_43676037的博客 471

Drugbank XML文件解析

DrugBank Release Version 5.1.13 | DrugBank Online点击download下载XML文件,也可以使用COMMAND命令下载。(下载文件需要先注册一个账号文件,就可以下载了)下载好压缩文件,并解压会得到如下两个文件:full database.xml就是我们所需要的XML文件,完整的XML很大,大约为1.6G因为原始的文件非常大,直接查看XML文件是有困难的,所以我们使用一下命令来查看该文件的前一百行 得到如下输出 对于前三行 第一行:表示XML 版本为 1.0

qtjbzs的博客 583

二级缓存、商品上下架的ES操作

一、首页加载的解决方案 nginx+lua+redis解决 当天的GIT地址: 商品的上架、商品的下架对应着ES添加、删除 当mysql里的首页广告表数据发生改变。我们需要手动发送一个请求到nginx里执行lua脚本。让其mysql最新的数据发送到redis里。下面使用canal来解决手动方式 1)缓存预热: 缓存预热:通过lua脚本,对广告指定位置的数据进行以及缓存。 lua脚本就会根据位置信息,从mysql数据库中,查询出广告数据,存入到redis中。(缓存预热,只有数据库发生变更的时候,才需要执行

qq_45666593的博客 983

机器视觉最全面试题总结

空洞卷积(Atrous Convolution)也叫做膨胀卷积、扩张卷积,最初的提出是为了解决图像分割在用下采样(池化、卷积)增加感受野时带来的特征图缩小,后再上采样回去时造成的精度上的损失。空洞卷积通过引入了一个扩张率的超参数,该参数定义了卷积核处理数据时各值的间距。可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样a. 是普通的卷积过程(dilation rate = 1),卷积后的感受野为3b. 是dilation rate = 2的空洞卷积,卷积后的感受野为5。

@bangbang的博客 9204

Camunda 7.x 系列【62】启动流程实例源码解析

为了更好的了解Camunda,接下来我们简单分析下启动流程实例相关源码

记录知识、锤炼自我 1171

API网关、服务编排与集成框架、消息队列——企业集成三大中间件详解

本文摘要: 企业集成三大核心中间件——API网关、服务编排与集成框架、消息队列,是构建现代分布式系统的关键技术组件。API网关作为统一入口,提供路由转发、认证鉴权、限流熔断等核心功能;服务编排与集成框架解决跨系统协同问题;消息队列实现系统间的异步解耦。文章重点对API网关进行了详细解析,包括其核心功能、主流开源方案(如Apache APISIX、Kong、Traefik等)的对比分析,以及典型应用场景和配置示例。这些中间件共同构成了现代企业系统集成的技术基础,帮助开发者构建高可用、高性能的分布式架构。

zhengliebin的博客 488

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

秒杀的设计

目录 秒杀场景: 可能出现的问题: 高并发: 超卖: 数据库: 链接暴露: 解决的方案: 服务职责单一: 秒杀连接加盐值: Redis: nginx : 资源静态化 限流: 前端限流: 后端限流: 按钮控制: 库存预热: lua: RabbitMQ消息队列: 总体流程: 秒杀场景: 一共一千台ps5,几十万的人同时抢。 可能出现的问题: 高并发: 同一时间出现同时的大量的请求,时间短,用户量...

qq_48430072的博客 220

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

银发通:一个适老化智慧就医平台的全栈实践项目

银发通是一款面向老年群体的智慧医疗平台,提供AI智能导诊、在线预约挂号、公益陪诊等服务。项目采用Vue3+FastAPI前后端分离架构,并引入Redis、RabbitMQ、Elasticsearch等中间件优化系统性能。主要亮点包括:Redis+Lua防止号源超卖、RabbitMQ延迟消息自动取消订单、Elasticsearch全文检索、Dify AI智能导诊等。系统通过Docker Compose实现一键部署,解决了老年人就医过程中预约复杂、信息获取困难等问题,具有较高的实用性和工程实践价值。

2302_80137276的博客 360

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

基于springboot的演唱会抢票系统_1u38746x

Spring封装了很多的java类库文件,在开发过程中,不需要写太多复杂的类文件,只需要引用spring这个框架,就可以完成快速开发的需要,所以Java编程的逻辑代码就变得比较清晰,各层之间的解耦性也比较强,可重用性也得到了很好的发挥,使得开发难度也更加轻松容易,它的主要两个特性就是依赖注入、面向接口思想;Vue实现了MVVM框架,通过后台的模型进行业务逻辑的处理,并将数据绑定到视图层中,在视图层绑定显示控件,将Model对象的数据绑定到页面控件中,实现数据的自动同步。数据库:mysql (版本不限)

qq_840612233的博客 381

黑马点评项目 | Redis学习笔记「纯享版」10w字超详细总结(含资料)

这次笔记是本人二刷Redis实战篇黑马点评的8w字汇总笔记。如果需要资料,于本文末尾查找即可

2025优快云博客之星Top246,后端开发技术领域新星创作者。 3万+
上一篇: Stomp协议学习与实战-1.1版
下一篇: 企业QQ SaaS团队,谈企业级LNMP架构设计
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值