首页 > 其他分享 >RocketMQ应用-基金购买秒杀实现

RocketMQ应用-基金购买秒杀实现

时间:2024-01-30 21:27:34浏览次数:26  
标签:info reqNo param 秒杀 购买 QPS logger public RocketMQ

架构支持

根据实际业务场景,分析集群分流的具体处理方案,假设基金购买接口单次处理时间为500ms,tomcat使用默认线程数200,则单个tomcat处理基金购买接口的QPS=1000/500*200=400。

场景1-4000QPS

要求实现4000QPS的并发量,可以部署10个tomcat集群应用,使用nginx做负载均衡,轮询分配到tomcat上。
image

场景2-10w QPS

要求实现10w QPS的并发量,nginx一般可支持5w QPS,可使用多个nginx进行集群部署,每个nginx轮询多个tomcat应用,nginx的入口流量使用硬件(Lvs/F5)进行负载均衡,可支持低于100w级别的QPS。
image

场景3-100w级别QPS

针对该级别的并发量,可按地域部署机房,通过DNS域名解析将网络请求分配到所属管辖区域的机房,实现流量分割。
image

业务实现

在基金购买交易过程中添加一个中间态,后端接收到购买交易请求时,先对请求做简单的过滤,并生成唯一的业务标识,然后向RocketMQ发送一条购买交易消息,之后向终端用户返回交易的中间态,友情提示用户主动查询交易状态;交易的真实处理逻辑放在RocketMq消费者中进行处理。这种方式可以更大限度的接收终端用户的请求数量。
业务接口处理终端请求的代码:

public void buyFundProdSpikes(TradeDTO param) {
        //1.为当前交易生成申请单号
        String reqNo = TransactionIdGenerator.generateReqTransactionId();
        // 创建 RocketMQ 的 交易申请消息
        Message<String> smsMessage = MessageBuilder
                .withPayload(JSON.toJSONString(param))
                .setHeader(RocketMQHeaders.KEYS, "SMS_" + reqNo)
                .build();
        //异步发送交易通知消息
        rocketMQTemplate.asyncSend("fundTradeTopic:tradeBuyTag", smsMessage, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                logger.info("产品预约申请消息已经发送");
            }

            @Override
            public void onException(Throwable throwable) {
                logger.info("产品预约申请消息发送失败");
            }
        });

    }

可在单独的服务器部署交易核心的处理代码
消费者监听部分:

@Component
@RocketMQMessageListener(
    topic = "fundTradeTopic",
    consumerGroup = "buyTradeConsumerGroup"
)
public class FundTradeTopicListener implements RocketMQListener<MessageExt> {

    private static final Logger logger = LoggerFactory.getLogger(FundTradeTopicListener.class);

    @Autowired
    private TradeService tradeService;

    @Override
    public void onMessage(MessageExt msgExt) {
        // 执行本地事务逻辑,返回事务状态
        try {
            String bodyStr = new String(msgExt.getBody());
            logger.info("消息消费开始:{}", bodyStr);
            TradeDTO param = JSON.parseObject(bodyStr, TradeDTO.class);
            tradeService.buyFundProdHandle(param, msgExt.getKeys().replace("SMS_", ""));
            logger.info("消息消费结束");
        } catch (Exception e) {
            logger.error("交易消息消费失败!", e);
            throw e;
        }
    }
}

业务逻辑处理部分:

public void buyFundProdHandle(TradeDTO param, String reqNo) {
        logger.info("创建订单服务调用开始。");
        //1. 校验消息是否已经消费
        boolean locked = redisUtils.setnx(reqNo, 60*10);
        if (!locked) {
            logger.info("订单:{}的创建消息已经消费", reqNo);
            return;
        }

        //2. 处理业务代码
        TradeEntity entity = BeanConverter.dataConvert(param, TradeEntity.class);
        FundInfoParam fundParam = new FundInfoParam();
        fundParam.setCode(param.getFundCode());
        fundParam.setTotalShr(param.getReqShr());
        //调用基金服务减少基金池份额
        logger.info("调用基金服务减少基金池份额开始。");
        R<String> r = fundService.buyFund(fundParam);
        logger.info("调用基金服务减少基金池份额结束。");
        if (R.ERROR.equals(r.getCode())) {
            throw new RuntimeException(r.getMsg());
        }
        if (param.getReqShr().compareTo(BigDecimal.valueOf(20000000)) == 0) {
            throw new RuntimeException("手动抛出异常");
        }
        //插入交易信息
        entity.setReqNo(reqNo);
        tradeMapper.insertTradeInfo(entity);
    }

标签:info,reqNo,param,秒杀,购买,QPS,logger,public,RocketMQ
From: https://www.cnblogs.com/zly1015/p/17997987

相关文章

  • RocketMQ应用-消费幂等性问题解决
    重复消费产生原因生产者多次投递-投递时服务端接收后客户端网络原因确认失败,重新投递消费者扩容重试-消费者扩容导致正在消费的消息没有正常应答,服务端重新推送重复消费解决方案给消息增加唯一key,消费时校验key是否已经消费过消费者控制消息的幂等性(多次同样的操作结果一......
  • RocketMQ应用-实现周期性自动任务
    应用背景提供配置功能,用于固定周期的执行某个动作;如在基金交易的每个交易日结束时,需要根据当天交易量计算基金的收益,可以提供定时任务,在每天晚上固定的时间计算收益数据。功能设计提供任务数据表task_info和任务执行记录表task_log_info;通过扫描task_info表中所有的任务配置数......
  • 手把手教你如何下载途途课堂上面已购买的视频课程
    前言:很多同学都想知道途途课堂的视频课程怎么下载,但是途途课堂上面已购买的视频课程是不提供直接下载方式的,所以下面就教大家如何用学无止下载器下载途途课堂上面已购买的视频课程。一、下载器首页输入T,并按回车,提示登录,再输入Y登录对应的途途账号二、此时会有弹窗让你登录,选择......
  • 手把手教你如何下载高途课堂上面已购买的视频课程
    前言:很多同学都想知道高途课堂的视频课程怎么下载,但是高途课堂上面已购买的视频课程是不提供直接下载方式的,所以下面就教大家如何用学无止下载器下载高途课堂上面已购买的视频课程。一、下载器首页输入G,并按回车,提示登录,再输入Y登录对应的高途账号二、此时会有弹窗让你登录,选择......
  • RocketMQ消息消费
    本文只提供生产者和消费者部分的示例代码,其它配置部分见RocketMQ消息客户端生产与消费的基本实现技术框架JDK:javaversion"1.8.0_391"RocketMQSDK:rocketmq-spring-boot-starter:2.2.3消息消费原理消费者必须关联一个指定的消费者分组,以获取分组内统一定义的行为配置和消......
  • RocketMQ—引言
    RocketMQ—引言MQ介绍在学习RocketMQ之前,我们先来看以下MQ的意思。MQ是MessageQueue的首字母缩写。Message:意思为消息,在我们生活中可以是一句话/一个短信/一个邮件;在计算机领域,放到实际业务中,就是一条数据。Queue:意思为队列。是一种先进先出的数据结构。我们要学习MQ,重......
  • 2024 上海个人购买新能源电动汽车送牌条件 All In One
    2024上海个人购买新能源电动汽车送牌条件AllInOne上海购买电动车条件上海市鼓励购买和使用新能源汽车实施办法上海市人民政府办公厅关于转发市发展改革委等五部门制订的《上海市鼓励购买和使用新能源汽车实施办法》的通知发布日期:2021-02-10第四条(消费者)本实施办法所......
  • RocketMQ
    领域模型https://rocketmq.apache.org/zh/docs/domainModel/01main/概述ApacheRocketMQ是一款典型的分布式架构下的中间件产品,使用异步通信方式和发布订阅的消息传输模型。通信方式和传输模型的具体说明,请参见下文通信方式介绍和消息传输模型介绍。ApacheRocketMQ产品具......
  • 【技术探讨】用户使用其他厂家433MHz无线模块时,购买样品OK,小批量100个就会出现偶尔无
        许多用户使用其他厂家的433M透传无线模块反馈这样的问题:前期购买几个样品测试,在无线信号覆盖半径内,收发包测试都很稳定,但是小批量购买100个模块收发就会出现无法收发的情况。这是什么原因呢?    首先科普一下,无线电波,在同一个信道同一时刻只允许一个节点发射行......
  • 数据挖掘||利用SQL Server 2012或者Excel 2013采用聚类和时序挖掘模型和算法,对自行车
    1.实验要求 利用SQLServer2012或者Excel2013(二者选择其一即可)进行数据挖掘实验,采用聚类和时序挖掘模型和算法,可以对附件中给定的excel数据进行聚类和时序挖掘实验,也可以采用自己采集的数据(如采用自选请说明数据来源)。 2.实验环境 操作系统:windows11;软件:Excel2019;SQLServer......