我对DDD的认知(一)
盼卓坷池一、关于RabbitMQ回调机制知识点补充: https://www.cnblogs.com/Mr-Keep/p/19140274在 RabbitMQ 中生产者发送消息后有可能遇到以下几种情况消息成功投递到交换机Exchange消息未能成功投递到交换机Exchange消息成功进入交换机但无法路由到队列Queue如果生产者端没有回调确认机制就可能出现严重的数据不一致举例 Redis 已经增加点赞数但消息并未真正进入 MQ数据库后续也无法更新就出现了 “缓存超前、数据库缺失” 的问题。为了解决这种问题Spring AMQP 提供了RabbitTemplate.setConfirmCallback()RabbitTemplate.setReturnsCallback()来捕获和处理消息投递的成功与失败。但是在复杂系统中不同的业务消息例如“下单”、“扣库存”、“发积分”在投递失败时需要采取不同的补偿逻辑。弊端如果你只写一份大而全的回调逻辑代码就会充满大量的 if else 判断非常难维护。二、策略模式思想引入策略模式的核心思想是定义一系列算法或行为让它们可以相互替换且算法的变化不会影响使用算法的客户。“算法” ≈ “不同的消息回调处理逻辑”“客户” ≈ “RabbitTemplate 的 ConfirmCallback 回调”操作通过根据业务抽象接口 Map 注入在运行时动态选择。代码实现1、定义统一的回调处理接口public interface ConfirmCallbackService {/*** 投递失败后的回调处理* param message 投递的消息对象*/void confirmCallback(Message message);}例定义点赞案例的实现类可选public class LikeConfirmCallback implements ConfirmCallbackService{/*** 注入RedisTemplate*/private final RedisTemplate redisTemplate;/*** 执行失败后的反向操作* param message 投递的消息对象*/Overridepublic void confirmCallback(Message message) {byte[] bytes message.getBody();//反向序列化为LikeDTO对象try {LikeDTO dto new ObjectMapper().readValue(bytes, LikeDTO.class);if(dto.getLikeStatus()){redisTemplate.opsForSet().add(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue()dto.getEid(), dto.getUid());}else{redisTemplate.opsForSet().remove(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue()dto.getEid(),dto.getUid());}} catch (IOException e) {throw new RuntimeException(e);}}}小技巧可选不单独定义类而是让业务层本身实现ConfirmCallbackService接口,简化书写操作分离成策略类则更利于模块化、解耦和扩展。2、回调上下文: 策略分发器ComponentRequiredArgsConstructorSlf4jpublic class ConfirmCallbackContext {/*** 注入RabbitTemplate*/private final RabbitTemplate rabbitTemplate;/*** 注入所有ConfirmCallbackService的实现类* 在不同的业务场景调用不同的实现来处理投递失败的业务逻辑*/private final Map confirmCallbackServiceMap;/*** 统一调用回调处理* 在容器初始化就执行这个方法*/PostConstructpublic void confirmCallback(){rabbitTemplate.setConfirmCallback((cdata,ack,cause)-{ReturnedMessage returnedMessage cdata.getReturned();if(ack){log.info(The message was delivered to the{},returnedMessage);}else{//获取业务实现的bean的idString beanName returnedMessage.getReplyText();//根据bean的名称从map中获取相应的实现类ConfirmCallbackService callbackService confirmCallbackServiceMap.get(beanName);callbackService.confirmCallback(returnedMessage.getMessage());}});}}核心原理Spring Boot 会自动扫描所有实现 ConfirmCallbackService 的 BeanBean 名称作为 keyBean 实例作为 value 注入到 MapConfirmCallbackContext 根据 replyText 动态找到对应的策略实现类3.消息发送端封装ComponentRequiredArgsConstructorpublic class RabbitManager {private final RabbitTemplate rabbitTemplate;public void send(String exchange,String routingKey,String callbackBeanName,T data){try {//创建cdata对象并设置一个idCorrelationData correlationData new CorrelationData(UUID.randomUUID().toString());//将投递的数据转换为byte[]byte[] bytes new ObjectMapper().writeValueAsBytes(data);//将bytes封装为Message对象Message message new Message(bytes);//创建一个投递失败时返回的消息对象ReturnedMessage returnedMessage new ReturnedMessage(message, 0,callbackBeanName, exchange,routingKey);//将ReturnedMesssage保存到cdata中correlationData.setReturned(returnedMessage);//发送rabbitTemplate.convertAndSend(exchange,routingKey,data,correlationData);} catch (Exception e) {throw new RuntimeException(e);}}}** 关键点**callbackBeanName 会被放进 replyText 中作为“回调策略的指针”。4.点赞业务逻辑方法4.1简化写法Overridepublic LikeDTO likeEssay(Integer uid, Integer eid) {boolean likeStatus false;//如果缓存中存在用户id则取消点赞不存在则添加用户id记录点赞if(isLike(eid, uid)) {//将用户ID从set集合中移除redisTemplate.opsForSet().remove(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() eid, uid);} else {likeStatus true;//将用户ID添加到set集合中redisTemplate.opsForSet().add(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() eid, uid);}//获取当前帖子在redis中的点赞总数Long likeCount redisTemplate.opsForSet().size(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() eid);//创建LikeDTO封装修改的数据并发布到消息队列LikeDTO likeDTO new LikeDTO(eid, uid, likeCount,likeStatus);//发送到mq异步更新到数据库rabbitManager.send(RabbitmqConfig.EXCHANGE_NAME, RabbitmqConfig.ROUTING_KEY,likeServiceImpl, likeDTO);return likeDTO;}/*** 消息投递失败后的处理* param message 失败后返回的消息*/Overridepublic void confirmCallback(Message message) {byte[] bytes message.getBody();try {//反序列化为LikeDTO对象LikeDTO dto new ObjectMapper().readValue(bytes, LikeDTO.class);//执行反向操作if(dto.getLikeStatus()) {redisTemplate.opsForSet().remove(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() dto.getEid(), dto.getUid());} else {redisTemplate.opsForSet().add(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() dto.getEid(), dto.getUid());}} catch (IOException e) {throw new RuntimeException(e);}}4.2 有业务实现类时public LikeDTO likeEssay(Integer uid, Integer eid) {boolean likeStatus false;//如果缓存中存在用户id则取消点赞不存在则添加用户id记录点赞if(isLike(uid,eid)){//取消点赞redisTemplate.opsForSet().remove(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue()eid,uid.toString());likeMapper.deleteLike(eid,uid);}else{likeStatus true;//将用户ID添加到set集合中redisTemplate.opsForSet().add(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue()eid,uid.toString());}//获取当前帖子在redis中的点赞总数Long likeCount redisTemplate.opsForSet().size(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() eid);//创建LikeDTO封装修改的数据并发布到消息队列LikeDTO likeDTO new LikeDTO(eid, uid, likeCount,likeStatus);//发送到mq异步更新到数据库rabbitManager.send(RabbitmqConfig.EXCHANGE_NAME,RabbitmqConfig.ROUTING_KEY,likeConfirmCallbackService,likeDTO);return likeDTO;}

相关新闻

基于Chrome开源提取的界面开发框架开篇

基于Chrome开源提取的界面开发框架开篇

嫉谪衬映集成特性 架构 这个集成分三层: C 层(nxt_php_sapi.c, nxt_php_extension.c) 在 PHP 里注册 TrueAsync SAPI 给每个请求创建协程 通过 nxt_unit_run() 管理事件循环 通过 nxt_unit_response_write_nb() 实现非阻塞数据传输 PHP 扩展层…

2026/7/3 22:08:10 阅读更多 →
LangChain DeepAgents 速通指南(三)—— 让Agent告别混乱:Tool Selector与Todo List中间件解析

LangChain DeepAgents 速通指南(三)—— 让Agent告别混乱:Tool Selector与Todo List中间件解析

上篇文章深入探讨了LangChain DeepAgents内置的Summarization中间件。该中间件能够自动压缩对话历史,有效解决大模型上下文窗口限制的问题。本期笔者将继续深入介绍LangChain DeepAgents框架预置的两个非常实用的中间件——Tool Selector(工具选择器&…

2026/5/17 10:26:25 阅读更多 →
Microsoft NLayerApp案例理论与实践 - 多层架构与应用系统设计原则

Microsoft NLayerApp案例理论与实践 - 多层架构与应用系统设计原则

焙礁炒毁DeepSeek-OCR是由DeepSeek-AI提出的、用于探索通过光学2D映射压缩长上下文可行性的视觉语言模型(VLM),核心包含DeepEncoder(编码器)和DeepSeek3B-MoE-A570M(解码器)两大组件。其中DeepE…

2026/5/17 10:26:24 阅读更多 →

最新新闻

5个高效解决方案:如何利用Buzz命令行快速实现离线语音转文字

5个高效解决方案:如何利用Buzz命令行快速实现离线语音转文字

5个高效解决方案:如何利用Buzz命令行快速实现离线语音转文字 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 你是…

2026/7/4 7:49:09 阅读更多 →
数字手写的革命:Saber如何重新定义跨平台笔记体验

数字手写的革命:Saber如何重新定义跨平台笔记体验

数字手写的革命:Saber如何重新定义跨平台笔记体验 【免费下载链接】saber The cross-platform open-source app built for handwriting 项目地址: https://gitcode.com/GitHub_Trending/sab/saber 你是否曾在寻找一款真正理解手写需求的数字笔记工具&#xf…

2026/7/4 7:49:09 阅读更多 →
FaceFusion 3.5.0终极指南:深度解析人脸融合核心算法与实战优化

FaceFusion 3.5.0终极指南:深度解析人脸融合核心算法与实战优化

FaceFusion 3.5.0终极指南:深度解析人脸融合核心算法与实战优化 【免费下载链接】facefusion Industry leading face manipulation platform 项目地址: https://gitcode.com/GitHub_Trending/fa/facefusion FaceFusion作为行业领先的人脸操作平台&#xff0c…

2026/7/4 7:47:08 阅读更多 →
Agent Skills技能日志记录:建立完整的技能执行日志系统

Agent Skills技能日志记录:建立完整的技能执行日志系统

Agent Skills技能日志记录:建立完整的技能执行日志系统 【免费下载链接】agentskills Specification and documentation for Agent Skills 项目地址: https://gitcode.com/GitHub_Trending/ag/agentskills 在AI代理快速发展的今天,Agent Skills技…

2026/7/4 7:45:08 阅读更多 →
kube-prod-runtime开发者手册:贡献代码与扩展功能的正确姿势

kube-prod-runtime开发者手册:贡献代码与扩展功能的正确姿势

kube-prod-runtime开发者手册:贡献代码与扩展功能的正确姿势 【免费下载链接】kube-prod-runtime A standard infrastructure environment for Kubernetes 项目地址: https://gitcode.com/gh_mirrors/ku/kube-prod-runtime kube-prod-runtime是一个为Kuberne…

2026/7/4 7:45:08 阅读更多 →
Error Lens核心功能详解:让错误和警告一目了然

Error Lens核心功能详解:让错误和警告一目了然

Error Lens核心功能详解:让错误和警告一目了然 【免费下载链接】vscode-error-lens VSCode extension that enhances display of errors and warnings. 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-error-lens Error Lens是Visual Studio Code中一款…

2026/7/4 7:43:08 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻