基于RocketMQ设计秒杀
文章内容输出来源:拉勾教育Java高薪训练营
环境介绍
服务器: 阿里云Centos7.4
JDK版本: jdk1.8
RocketMQ版本: 4.5.1
安装RocketMQ
wget https://archive.apache.org/dist/rocketmq/4.5.1/rocketmq-all-4.5.1-bin-release.zip
启动nameserver
# 1.启动
NameServermqnamesrv
# 2.查看启动日志
tail -f ~/logs/rocketmqlogs/namesrv.log
启动broker
mqbroker -n localhost:9876
# 2.查看启动日志
tail -f ~/logs/rocketmqlogs/broker.log
基于RocketMQ设计秒杀实现逻辑
这里的超时支付使用redis过期回调处理
核心代码 :
@Component
@RocketMQMessageListener(topic = "springboot-mq",consumerGroup = "springboot-mq-consumer-1")
public class Consumer implements RocketMQListener<OrderInfo> {@ResourceOrderInfoMapper orderInfoMapper;@ResourceWarehouseMapper warehouseMapper;@AutowiredStringRedisTemplate redisTemplate;@Overridepublic void onMessage(OrderInfo orderInfo) {System.out.println("消费订单消息");orderInfoMapper.insert(orderInfo);System.out.println(orderInfo.getId()+"订单入库");Warehouse warehouse = warehouseMapper.selectByPrimaryKey(orderInfo.getCommodity());warehouse.setNum(warehouse.getNum()-1);System.out.println("扣减库存");warehouseMapper.updateByPrimaryKey(warehouse);redisTemplate.opsForValue().set("order:"+orderInfo.getId(),"",15,TimeUnit.SECONDS);}}
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {@ResourceOrderInfoMapper orderInfoMapper;@ResourceWarehouseMapper warehouseMapper;@AutowiredStringRedisTemplate redisTemplate;public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}public void onMessage(Message message, byte[] pattern) {String expireKey = message.toString();if (expireKey.startsWith("order:")){Integer orderId = Integer.valueOf(expireKey.replace("order:",""));OrderInfo orderInfo = orderInfoMapper.selectByPrimaryKey(orderId);orderInfo.setStatus(2);orderInfoMapper.updateByPrimaryKeySelective(orderInfo);System.out.println("订单失效,库存还原+1");Warehouse warehouse = warehouseMapper.selectByPrimaryKey(orderInfo.getCommodity());warehouse.setNum(warehouse.getNum()+1);warehouseMapper.updateByPrimaryKey(warehouse);redisTemplate.opsForValue().increment("num");}}}
@Service
public class OrderService {@ResourceOrderInfoMapper orderInfoMapper;@AutowiredStringRedisTemplate redisTemplate;@Autowiredprivate RocketMQTemplate rocketMQTemplate;public Integer submitOrder(Integer commodity){Integer id = getOrderNum();OrderInfo orderInfo = new OrderInfo();orderInfo.setId(id);orderInfo.setCommodity(commodity);orderInfo.setStatus(0);boolean flag = subtractStock(1);if(!flag){return -1;}rocketMQTemplate.convertAndSend("springboot-mq",orderInfo);return id;}public Integer pay(Integer id){Boolean delete = redisTemplate.delete("order:" + id);System.out.println(delete);if(delete){return 1;}return 0;}/*** 模拟订单号* @return*/public Integer getOrderNum(){Random random = new Random();return random.nextInt(10000);}/*** Redis乐观锁实现秒杀* @param num* @return*/public boolean subtractStock(Integer num) {String key = "num";redisTemplate.setEnableTransactionSupport(true);redisTemplate.watch(key);Object value = redisTemplate.opsForValue().get(key);if (value == null) {//前提 提前将商品库存放入缓存 ,如果缓存不存在,视为没有该商品return false;}//先检查 库存是否充足Integer stock = Integer.valueOf(value.toString());if (stock < num) {System.out.println("库存不足");return false;}redisTemplate.multi();Long newStock = redisTemplate.opsForValue().increment(key, -num.longValue());System.out.println(newStock);List<Object> exec = redisTemplate.exec();if(exec!=null && exec.size()>0){return true;}return false;}
}
写在最后
工作几年,一直都没有去体系化的学习,很多东西没有复杂的工作场景经验,去年综合几家机构,最后还是决定报了拉勾的高薪训练营,在这里也是实实在在的学习到了很多,学完掌握程度也比之前深了很多,而且还有定期的内推,多了更多的机会,真的对我有了很大的帮助提升。
基于RocketMQ设计秒杀相关推荐
- 如何基于RocketMQ设计一套全链路消息不丢失方案?
我们使用MQ作为消息中间件,传输一些消息的时候,必须考虑到消息丢失的可能.因为有的时候消息丢失了,会产生很严重的后果,比如消息计费数据,跟钱有关的消息. 这篇文章我们以RocketMQ为例来讲解,如何 ...
- 基于rocketMq秒杀系统demo
基于RocketMQ设计秒杀. 要求: 1. 秒杀商品LagouPhone,数量100个. 2. 秒杀商品不能超卖. 3. 抢购链接隐藏 4. Nginx+Redis+ ...
- 实战:基于 RocketMQ 的电商高并发秒杀场景
内容简介: "秒杀"这一业务场景在如今已经不是什么新鲜名词,它本质上属于短时突发性高并发访问问题,业务特点如下: 定时触发,流量在瞬间突增: 秒杀请求中常常只有部分能够成功: 秒杀 ...
- 春招高频面试题:怎样设计秒杀系统?
前言 高并发下如何设计秒杀系统?这是一个高频面试题.这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识. 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个 ...
- 基于 RocketMQ 的基金数字化陪伴体系的架构实践
作者|伍振河 本文以博时基金的金融场景为案例,阐述 RocketMQ 在提升客户陪伴效率和丰富金融场景化能力等方面的提升作用. 行业背景 基金公司的核心业务主要分为两部分,一部分是投研线业务,即投资管 ...
- 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
作者 | 陈厚道 冯庆 来源 | 阿里巴巴云原生公众号 导读:本文将对 RocketMQ-Exporter 的设计实现做一个简单的介绍,读者可通过本文了解到 RocketMQ-Exporter 的实 ...
- 博时基金基于 RocketMQ 的互联网开放平台 Matrix 架构实践
简介: Matrix 经过一年多的建设,目前已具备多渠道统一接入.第三方生态互联互通.基金特色交易场景化封装等功能特性.Matrix 通过建设有品质.有温度的陪伴,从技术上和体验上,让用户理解风险,理 ...
- 大神手把手教你设计秒杀架构模型
中生代技术 链接技术大咖,分享技术干货 全文:4000字 作者:Yrion 原文首发:https://www.cnblogs.com/wyq178/p/11261711.html 前言:秒杀系统相信很 ...
- 秒杀限制人群,如何设计秒杀服务的限流策略?
对于秒杀业务,大家应该比较熟悉了.比如,"某商品原价 1299 元, 双十一整点秒杀价仅 500 元,限量 100 件,先到先得" 等等.通过这段文案我们能够发现,参与秒杀活动商品 ...
最新文章
- 使用Varnish+ESI实现静态页面的局部缓存
- linux 设置网络
- 数据中心机房建设几个重要的国家标准
- windows 搭建kms服务器激活_自建KMS激活服务器的两种方法
- java B2B2C springmvc mybatis多租户电子商城系统-Spring Cloud Ribbon
- php下的原生ajax请求
- Vue中富文本编辑器的使用
- webservice CXF入门服务端
- windows下用XShell远程ubuntu时连接失败
- ubuntu man命令彩色高亮显示
- 【Matlab】Matlab2014修改默认工作目录
- 图像质量评价指标MSE/PSNR/SSIM
- heartbeat高可用详解
- The JAVA_HOME environment variable is not defined correctly(亲测有效)
- 和生活一起理解51单片机① 如何入门学习单片机
- 2020工商银行信息技术岗校招笔试经历
- Echarts 饼图设置标签颜色(单个标签颜色、多个标签颜色)
- 数据类型在内存中的存储原理
- 阿里云python自测答案_阿里云技能测试python初级中级高级
- 高性能永磁交流伺服电机系统控制策略