首页 > 其他分享 >RocketMQ实现黑马点评优惠卷下单

RocketMQ实现黑马点评优惠卷下单

时间:2024-07-19 17:55:36浏览次数:14  
标签:log voucherOrder 优惠卷 订单 秒杀 下单 VoucherOrder RocketMQ

背景

在现代电商系统中,秒杀活动因其高并发、高负载的特点,对系统的稳定性和性能要求极高。为了有效地处理秒杀活动中的高并发请求,消息队列成为了一个重要的解决方案。本文将介绍如何使用RocketMQ来实现秒杀下单的功能。

目标

通过RocketMQ来实现一个秒杀订单的处理流程,保证在秒杀活动中能够高效地处理用户的下单请求,并且在系统负载高的情况下保持良好的性能。

实现步骤

  1. 创建订单

    用户在秒杀活动中提交订单请求时,我们首先需要创建一个订单对象。以下代码展示了如何创建一个订单对象并将其发送到RocketMQ消息队列中:

    VoucherOrder voucherOrder = new VoucherOrder();
    voucherOrder.setId(orderId);
    voucherOrder.setUserId(userId);
    voucherOrder.setVoucherId(voucherId);
    
    // 发送消息到RocketMQ
    rocketMQTemplate.asyncSend("orderTopic", voucherOrder, new SendCallback() {
        @Override
        public void onSuccess(SendResult sendResult) {
            log.info("发送成功");
        }
    
        @Override
        public void onException(Throwable throwable) {
            log.info("发送失败:" + throwable.getMessage());
            log.info("订单是:" + voucherOrder);
        }
    });
    // 返回订单id
    return Result.ok(orderId);
    

    在上述代码中,我们创建了一个 VoucherOrder 对象,并将其发送到RocketMQ的 orderTopic 主题。SendCallback 回调函数用于处理发送成功和失败的情况。

  2. 消费消息

    订阅了 orderTopic 主题的消费者将会处理这些消息。以下是处理秒杀订单消息的代码示例:

    @Component
    @RocketMQMessageListener(topic = "orderTopic", consumerGroup = "voucher-consumer-group", consumeMode = ConsumeMode.CONCURRENTLY)
    @Slf4j
    public class VoucherOrderListener implements RocketMQListener<MessageExt> {
        @Resource
        private IVoucherOrderService voucherOrderService;
    
        @Resource
        private ISeckillVoucherService seckillVoucherService;
    
        @Override
        public void onMessage(MessageExt messageExt) {
            try {
                String body = new String(messageExt.getBody());
                VoucherOrder voucherOrder = JSON.parseObject(body, VoucherOrder.class);
    
                log.info("接收到存储订单信息的消息", JSON.toJSON(voucherOrder).toString());
    
                // 更新库存
                boolean success = seckillVoucherService.update()
                    .setSql("stock=stock-1")
                    .eq("voucher_id", voucherOrder.getVoucherId())
                    .gt("stock", 0)
                    .update();
    
                // 保存订单
                voucherOrderService.save(voucherOrder);
    
                log.info("订单信息存储完成? {}", success);
            } catch (Exception e) {
                log.error("处理消息失败", e);
            }
        }
    }
    

    VoucherOrderListener 中,我们处理了从消息队列中获取的订单消息。首先将消息体转换为 VoucherOrder 对象,然后更新库存,并将订单信息保存到数据库中。如果处理过程中出现异常,会记录错误信息。

总结

通过RocketMQ实现秒杀下单的流程,有效地解耦了订单生成与处理的过程,提高了系统的稳定性和扩展性。使用消息队列可以将高并发的请求进行异步处理,避免直接对数据库的压力过大,从而提升系统的响应速度和稳定性。

标签:log,voucherOrder,优惠卷,订单,秒杀,下单,VoucherOrder,RocketMQ
From: https://blog.csdn.net/Takumilove/article/details/140549166

相关文章

  • 使用RocketMQ 实现基于标签过滤的消息队列生产和消费
    在分布式系统中,消息队列(MessageQueue,MQ)是一种常见的通信方式,它能够解耦系统组件,提供异步通信,提升系统的伸缩性和可靠性。ApacheRocketMQ是一款开源的分布式消息中间件,具有高性能、低延迟、高可靠性和高可用性等特点。本文将介绍如何使用ApacheRocketMQ实现基于标签过......
  • 测试面试宝典(五)—— 请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归
    集成测试和系统测试在软件测试周期中都起着重要作用,但它们在测试目标、测试范围、测试方法和应用场景等方面存在着明显的区别。集成测试主要是将各个模块、组件或者子系统组合在一起进行的测试,目的是验证这些模块之间的接口是否正确,数据传递和交互是否符合预期,以及它们集成后......
  • 亚马逊自养号测评环境系统全解析:从注册到下单,一次成号无忧
    亚马逊测评的关键在于养号,这是因为测评需要买家账号来操作。而养号不仅仅是让账号能多次使用,更重要的是通过维护让账号更健康、更有价值。很多人容易忽略的是,首次购买(首单)的成功率和它对账号的重要性。首单成功率高,账号就能更快地建立起良好的记录,对后续的测评结果也有积极影响......
  • Rocketmq双主双从部署
    一、概要RocketMQ是一个分布式消息和流媒体平台,具有低延迟、高性能和可靠性、万亿级容量和灵活的可扩展性。整个流程如下:1)启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来完成注册,相当于一个路由控制中心。2)Broker启动,跟所有的NameServer保......
  • RocketMQ概念与模型
    为啥要用MQ?这个都应该会背了,6个字解耦、异步、削峰RocketMQ的优缺点?适用场景?主要与Kafka相比单机吞吐量:十万级(类似kafka)消息堆积:支持10亿级别消息堆积源码是Java天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其电商里订单扣款、业务削峰,业务场景在阿里双11经历过......
  • debian11 podman搭建rocketmq (初步测试)
    前言由于个人学习测试需要,想要在debian11环境下,使用podman搭建一个简单的单节点rocketmq,搭建过程比较繁琐,所以记录下来留作后续参考。由于对rocketmq镜像不熟悉,有些配置可能存在错误,会在后续有能力优化时继续更新此文档。后续可能会补充podman-compose实现方式,目前是shell脚本......
  • 深入解析RocketMQ的存储设计艺术(一)
    1. DomainModel领域模型(DomainModel)是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。1.1 MessageMessage是RocketMQ消息引擎中的主体。mes......
  • jmeter插件开发—RocketMQ4.9
    上期是使用java测试了rocketmq中间件的测试,考虑到后期性能测试,准备封装为jmeter插件。参考TesterHome的文章环境说明JDK1.8.0,Jmeter5.4.3,maven构建工具(使用JDK17时遇到过跟Jmeter设置的外观有冲突)实现代码(pom.xml已贴在上期的文章最后)以下为全部代码,可以自行调整相关参数,实现......
  • 黑马点评下订单-小程序下单没问题但是Postman发送请求失败了,返回401
    经过多方探索,这个✓8错误就是由于黑马点评使用了拦截器,我们直接发送请求是会被拦截器拦截下来的,我给出的解决方案是通过配置Postman解决,方法很简单!解决方案右边的value写上Redis里面登录所用token值就可以了!!!......
  • RocketMQ 基础教程-高级功能汇总
    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析......