# oz-rocketmq-demo **Repository Path**: coderman_hero/oz-rocketmq-demo ## Basic Information - **Project Name**: oz-rocketmq-demo - **Description**: RocketMQ安装与应用相关,模拟实现秒杀场景 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-03-02 - **Last Updated**: 2023-03-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # oz-rocketmq-demo #### 介绍 RocketMQ安装与应用相关,模拟实现秒杀场景 #### RocketMQ安装 1. 下载安装包 ```shell #源码,需编译 wget https://github.com/apache/rocketmq/archive/rocketmq-all-4.5.1.tar.gz #已编译 wget https://archive.apache.org/dist/rocketmq/4.5.1/rocketmq-all-4.5.1-bin-release.zip ``` 2. 解压到/opt目录 ```shell tar -zxvf rocketmq-all-4.5.1.tar.gz -C /opt ``` 3. 安装maven插件,如果下载的使已编译好的就不需要了 ```shell #由于下载到的rocketmq是源码,需要对源码进行编译,编译使用maven,若linux没有安装,需做该操作 wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /opt vim /opt/apache-maven-3.6.3/conf/setting.xml #新增maven镜像http://maven.aliyun.com/nexus/content/groups/public/ #配置环境变量,编辑文件/etc/profile在最下面添加以下内容 MAVEN_HOME=/usr/local/src/apache-maven-3.6.3 export MAVEN_HOME export PATH=${PATH}:${MAVEN_HOME}/bin #使环境变量生效 source /etc/profile #验证 mvn -v 得到maven信息,则成功配置完 #编译rocketmq,在rocketmq目录下执行 mvn -Prelease-all -DskipTests clean install -U ``` 4. rocketmq 启动,进入bin目录 ```shell # 1.启动NameServer ./mqnamesrv # 2.查看启动日志 tail -f ~/logs/rocketmqlogs/namesrv.log # 1.启动Broker ./mqbroker -n localhost:9876 autoCreateTopicEnable=true # 2.查看启动日志 tail -f ~/logs/rocketmqlogs/broker.log ``` #### RocketMQ实现秒杀场景 ![img](https://s0.lgstatic.com/i/image/M00/45/A7/Ciqc1F9DU4-AHMp1AABJWvvxJxo535.png) 1. 使用技术:Nginx+Redis+RocketMQ+Tomcat+MySQL nginx安装与配置:https://gitee.com/orangezh/minicat#nginx Redis安装与配置:https://gitee.com/orangezh/oz-demo-redis 2. 场景实现流程描述: - 首先使用nginx做反向代理隐藏正式链接 - 后台新增秒杀产品后将产品库存缓存到Redis中 - 用户提交秒杀商品前先检测Redis中库存是否足够,足够则提交相关信息到RockectMQ中 - 启动一个订单消费者消费已抢到商品的用户相关信息,然后创建订单并扣减Mysql库中的商品库存,并提交一个订单已创建的延迟队列 - 再启动一个订单超时检测消费者消费已创建订单的延迟消息,如果订单未支付,那就将订单状态更新为已取消,并恢复Mysql和Redis中的库存 单个订单测试流程打印: ``` 1、uid1616034293895用户抢购成功!Redis库存:-1 2、抢购消息已发送成功:SendResult [sendStatus=SEND_OK, msgId=0A0A018C1FE818B4AAC259C83B390000, offsetMsgId=0A0A020800002A9F0000000000003E44, messageQueue=MessageQueue [topic=ozdemo_seckill_topic, brokerName=localhost.localdomain, queueId=1], queueOffset=2] 3、uid1616034293895用户创建订单(oid1616034293895)成功!Mysql库存:-1 4、订单延迟检测消息已发送成功:SendResult [sendStatus=SEND_OK, msgId=0A0A018C1FE818B4AAC259C83F520004, offsetMsgId=0A0A020800002A9F000000000000417B, messageQueue=MessageQueue [topic=ozdemo_order_delay_topic, brokerName=localhost.localdomain, queueId=3], queueOffset=4] 5、uid1616034293895用户订单(oid1616034293895)超时未支付,订单已取消!Mysql库存:+1 -- Redis库存:+1,现有库存:100 ``` 代码中使用多线程模拟抢购流程 测试地址: - 创建商品:http://localhost:8080/product/createOrUpdate - 秒杀商品:http://localhost:8080/seckill?buyNum={购买数量}&productId={购买商品ID} 测试流程: 1. 先创建商品 2. 再提交秒杀请求