feat(count): 实现笔记点赞计数功能

- 新增笔记点赞计数 MQ DTO 类
- 实现笔记点赞计数消费者,支持流量削峰与批量聚合
- 实现笔记点赞计数落库消费者,带限流处理
- 新增笔记点赞类型枚举类
- 添加笔记点赞相关 MQ Topic 常量定义
- 扩展笔记计数 Mapper,支持点赞数更新
- 新增 Redis 笔记计数 Key 构建方法及字段常量
- 在笔记服务中发送点赞计数 MQ 消息
This commit is contained in:
2025-10-18 16:16:18 +08:00
parent cfcd12be0d
commit 54c34706fb
10 changed files with 316 additions and 2 deletions

View File

@@ -11,10 +11,14 @@ import com.hanserwei.hannote.note.biz.model.dto.LikeUnlikeNoteMqDTO;
import com.hanserwei.hannote.note.biz.service.NoteLikeDOService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@@ -36,6 +40,8 @@ public class LikeUnlikeNoteConsumer implements RocketMQListener<Message> {
private NoteLikeDOMapper noteLikeDOMapper;
@Resource
private NoteLikeDOService noteLikeDOService;
@Resource
private RocketMQTemplate rocketMQTemplate;
@Override
public void onMessage(Message message) {
@@ -94,7 +100,25 @@ public class LikeUnlikeNoteConsumer implements RocketMQListener<Message> {
// 执行更新
boolean update = noteLikeDOService.update(updateEntity, wrapper);
// TODO: 删除计数
if (!update) {
return;
}
// 更新数据库成功后,发送计数 MQ
org.springframework.messaging.Message<String> message = MessageBuilder.withPayload(bodyJsonStr)
.build();
// 异步发送 MQ 消息
rocketMQTemplate.asyncSend(MQConstants.TOPIC_COUNT_NOTE_LIKE, message, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
log.info("==> 【计数: 笔记取消点赞】MQ 发送成功SendResult: {}", sendResult);
}
@Override
public void onException(Throwable throwable) {
log.error("==> 【计数: 笔记取消点赞】MQ 发送异常: ", throwable);
}
});
}
/**
@@ -128,7 +152,27 @@ public class LikeUnlikeNoteConsumer implements RocketMQListener<Message> {
// 添加或更新笔记点赞记录
boolean count = noteLikeDOMapper.insertOrUpdate(noteLikeDO);
// TODO: 发送计数 MQ
if (!count) {
return;
}
// 发送计数 MQ
// 更新数据库成功后,发送计数 MQ
org.springframework.messaging.Message<String> message = MessageBuilder.withPayload(bodyJsonStr)
.build();
// 异步发送 MQ 消息
rocketMQTemplate.asyncSend(MQConstants.TOPIC_COUNT_NOTE_LIKE, message, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
log.info("==> 【计数: 笔记点赞】MQ 发送成功SendResult: {}", sendResult);
}
@Override
public void onException(Throwable throwable) {
log.error("==> 【计数: 笔记点赞】MQ 发送异常: ", throwable);
}
});
}
}

View File

@@ -17,6 +17,11 @@ public interface MQConstants {
*/
String TOPIC_LIKE_OR_UNLIKE = "LikeUnlikeTopic";
/**
* Topic: 计数 - 笔记点赞数
*/
String TOPIC_COUNT_NOTE_LIKE = "CountNoteLikeTopic";
/**
* 点赞标签
*/