#生产环境修改记录接口频繁调用导致服务器负载高#
一、引入jar包
<!-- rocketmq 2.2.3-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.3</version>
</dependency>
二、application.yml 中配置mq连接信息
# rocketmq config
rocketmq:
name-server: 127.0.0.1:9876
consumer:
access-key: username
secret-key: password
producer:
group: xxx
access-key: username
secret-key: password
三、创建生产者代码
其中MqConst中的topic、tag常量信息自己定义
package com.beego.web.mq.producer;
import com.beego.model.vo.course.SavePptRecordVo;
import com.beego.web.mq.constant.MqConst;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.apache.rocketmq.spring.support.RocketMQHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* 保存(视频&直播)播放记录生产者
*
* @author zsf
*/
@Component
@Slf4j
@AllArgsConstructor
@EnableAsync
public class SavePlayRecordProduce {
private final RocketMQTemplate rocketMqTemplate;
@Async
public void sendMessage(SavePptRecordVo savePptRecordVo) {
log.info("发送保存(视频&直播)播放记录:{}", savePptRecordVo);
if (Objects.nonNull(savePptRecordVo)) {
rocketMqTemplate.syncSend(MqConst.TOPIC_GOLD_BEEGO_STUDENT+":"+MqConst.TAG_VIDEO_SAVEPPTRECORD,
MessageBuilder.withPayload(savePptRecordVo).setHeader(RocketMQHeaders.KEYS, savePptRecordVo.getRecordId()).build());
}
}
}
四、创建消费者代码
其中MqConst中的topic、tag常量信息自己定义
package com.beego.web.mq.consume;
import com.beego.model.vo.course.SavePptRecordVo;
import com.beego.web.course.service.IDmSpecialTypeService;
import com.beego.web.mq.constant.MqConst;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.apache.rocketmq.spring.core.RocketMQPushConsumerLifecycleListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author zsf
*/
@Slf4j
@Component
@RequiredArgsConstructor
@RocketMQMessageListener(consumerGroup = MqConst.GROUP_GOLD_BEEGO_STUDENT+MqConst.TAG_VIDEO_SAVEPPTRECORD,
topic = MqConst.TOPIC_GOLD_BEEGO_STUDENT, selectorExpression = MqConst.TAG_VIDEO_SAVEPPTRECORD)
public class SavePlayRecordConsumer implements RocketMQListener<SavePptRecordVo>, RocketMQPushConsumerLifecycleListener {
@Autowired
private IDmSpecialTypeService dmSpecialTypeService;
@Override
public void onMessage(SavePptRecordVo savePptRecordVo) {
log.info("接收保存(视频&直播)播放记录:{}", savePptRecordVo);
dmSpecialTypeService.savePlayRecordMq(savePptRecordVo);
}
@Override
public void prepareStart(DefaultMQPushConsumer consumer) {
// 每次拉取的间隔,单位为毫秒
consumer.setPullInterval(1000);
// 设置每次从队列中拉取的消息数为16 (线上环境10个Broker 默认每个Broker4个队列 则 10*4*8=320 每秒拉取处理320个消息)
consumer.setPullBatchSize(8);
}
}