Rabbitmq 消息中间件 秒杀问题思考
对于秒杀类似的高并发大流量处理问题,采用消息中间件处理比较合适。网上大部分解决方式似乎都在消费者端,采用basicQos限制消息取出个数,basicAck手动处理执行结果。其实很大部分不需要到消费者来处理,直接限制死队列的消息数,拒绝超过指定消息数的请求。可以考虑使用控制队列长度来完成。rabbitmq默认是超过数量的先废弃或进入死信,文档有个overflow的参数可以指定废弃的顺序,默认dropHead,改为reject-publish后会废弃最新的消息。
public Queue queue() {return QueueBuilder.nonDurable("mk") .maxLength(3).overflow(QueueBuilder.Overflow.rejectPublish).build();}
然而,通过测试发现,不管设置reject-publish或drop-head均没效果,都是采用废弃最新的消息,这样就无法满足我们秒杀的排队规则。也试过使用每次获取队列数量来控制队列消息数,但测试发现耗时太高。
public void getMessageCount() {long a = ToolKang.getUnixTimeDateMillisecond();String queue = "mk";AMQP.Queue.DeclareOk declareOk = template.execute(new ChannelCallback<AMQP.Queue.DeclareOk>() {public AMQP.Queue.DeclareOk doInRabbit(Channel channel) throws Exception {return channel.queueDeclarePassive(queue);}});long b = ToolKang.getUnixTimeDateMillisecond();}
Redis自增key 的好处
原子性(atomicity):一个事务是一个不可分割的最小工作单位,事务中包括的诸操作要么都做,要么都不做。
Redis所有单个命令的执行都是原子性的,这与它的单线程机制有关;
Redis命令的原子性使得我们不用考虑并发问题,可以方便的利用原子性自增操作
简单解释就是你的服务即使是多机器多进程的,incr也能保证每次返回的结果不会出现相同的值。
通过自增来实现队列数量的控制,效果比较好,同时也减轻消费端的压力,在源头就限制了队列消息数量。(虽然消费端也控制了读取数量)
Rabbitmq 消息中间件 秒杀问题思考相关推荐
- ①RabbitMQ 消息中间件/消息队列、单节点、集群、镜像集群
文章目录 RabbitMQ 消息中间件/消息队列 1.消息中间件 1.简介 2.作用 消息中间件的两种模式 P2P模式 Rabbitmq Pub/Sub模式(发布/订阅:Topic,可以重复消费) K ...
- RabbitMQ消息中间件技术精讲全集
RabbitMQ消息中间件技术精讲 导航: RabbitMQ消息中间件技术精讲 一. 主流消息中间件介绍 1.1 ActiveMQ 1.2 Kafka 1.3 RocketMQ 1.4 RabbitM ...
- 慕课网_《RabbitMQ消息中间件极速入门与实战》学习总结
慕课网<RabbitMQ消息中间件极速入门与实战>学习总结 时间:2018年09月05日星期三 说明:本文部分内容均来自慕课网.@慕课网:https://www.imooc.com 教学源 ...
- SpringCloud项目:实现推送消息到RabbitMQ消息中间件
作者:杨桃桃 blog.csdn.net/yt812100/article/details/111785839 一.CRT创建RabbitMQ容器 CRT容器自带RabbitMQ消息中间件,只需要在C ...
- RabbitMq 消息中间件介绍初体验
RabbitMq 消息中间件介绍&为什么要使用消息中间件&什么时候使用消息中 间件 我们用java来举例子, 打个比方 我们客户端发送一个下单请求给订单系统(order)订单系统发 ...
- springboot集成rabbitmq商品秒杀业务实战(流量削峰)
消息队列如何实现流量削峰? 要对流量进行削峰,最容易想到的解决方案就是用消息队列来缓冲瞬时流量,把同步的直接调用转换成异步的间接推送,中间通过一个队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送 ...
- rabbitmq实现秒杀中订单流量削峰
前言 在Redis秒杀功能设计与实现一篇中,我们使用redis实现了商品的秒杀抢购功能,在当前的设计中,只涉及到商品抢购,即用户锁定名额,并将成功抢购到的用户信息保存到redis中了 但是一个完整的抢 ...
- Linux中级实战专题篇:rabbitmq(消息中间件p2p模式和pub模式,消息队列rabbitmq详解,单机安装,集群部署以及配置实战)
一.消息中间件相关概念 1.简介 消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台相关 的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息 队列模型,可以在分布 ...
- RabbitMQ消息中间件-基础篇
文章目录 一.什么是MQ 1.1 mq的作用 1.2 mq的区别 二. RabbitMQ 2.1 四大核心概念 2.2 RabbitMQ核心部分 2.3 RabbitMQ工作原理 三.docker安装 ...
最新文章
- 2022-2028年中国工业固体废物综合利用行业深度调研及投资前景预测报告
- 量子力学——超弦理论、M理论(膜论)
- 2018年第九届蓝桥杯C/C++ C组国赛 —— 第四题:约瑟夫环
- 带你走进网站分析的世界!
- ECCV18 | 无监督难分样本挖掘改进目标检测
- PyTorch 1.0 中文文档:CUDA 语义
- javascript的数据检测总结
- 当html里语义化,HTML5语义化
- 改良版class选择器
- 使用计算机的好处作文,电脑的好处
- 死锁问题分析(个人认为重点讲到了gap间隙锁,解决了我一些不明报死锁的问题)
- 数组越界也可以这么巧~~~
- scipy库的pearsonr(x, y)的使用
- 深度学习领域堪称圣经的书籍(深度学习又称之为花书)-由图灵奖获得者Yoshua Bengio所著
- undefined运算
- 苹果手机怎么在照片上添加文字_怎么给手机照片添加文字?没想到方法这么容易,1分钟就能学会...
- 做自己想做的工作,你也可以
- unity 导出 ios 项目运行在模拟器
- 【转】Redis 分布式——可用性保证之 Sentinel(实战篇)
- JAVA日记之SpringJdbcTemplate/声明式事务控制 ----喝最烈的酒.
热门文章
- Ps安装包下载(cs6)
- 10个最新的 Bootstrap 3 管理模板
- 2021年保育员(初级)证考试及保育员(初级)复审模拟考试
- 【路径规划】基于matlab汽车零部件循环取货路径优化(三维装载约束)【含Matlab源码 1100期】
- 7思妙想之Js 实现for循环中的停顿
- Android 嵌套H5 网页,图片上传无法调用手机图片以及嵌套网页中无法调用另一款APP问题记录
- 腾讯云安装xampp搭建WordPress个人博客(步骤详细,小白向)
- 【Matlab】求解多元一次方程组
- 儿童首饰饰品CPC认证怎么办理?饰品CPC测试项目
- 中国极紫外(EUV)光刻胶行业营销动态与应用前景预测报告2022-2027