掌控消息全链路(4)——RabbitMQ/Spring-AMQP高级特性详解之事务与消息分发

掌控消息全链路(4)——RabbitMQ/Spring-AMQP高级特性详解之事务与消息分发
在这里插入图片描述

🔥我的主页:九转苍翎⭐️个人专栏:《Java SE》《Java集合框架系统精讲》《MySQL高手之路:从基础到高阶》《计算机网络》《Java工程师核心能力体系构建》《RabbitMQ理论与实践》天行健,君子以自强不息。


1.事务

AMQP(高级消息队列协议)实现了事务机制,主要用于确保消息的原子性发布和确认。换言之,它允许你将多个操作(如发送消息、确认消息)绑定在一起,要么全部成功,要么全部失败

发送消息

@RestController@RequestMapping("/producer")publicclassProducerController{@Resource(name ="transRabbitTemplate")privateRabbitTemplate transRabbitTemplate;@Transactional@RequestMapping("/trans")publicStringtrans(){ transRabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE,"trans test ---> 1");int num =5/0; transRabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE,"trans test ---> 2");return"发送成功";}}
在这里插入图片描述


Spring Boot的RabbitMQ自动配置默认会确认模式,但RabbitMQ不允许同一个通道同时使用事务模式和确认模式,所以需要确保publisher confirms被禁用

spring:rabbitmq:publisher-confirm-type: none publisher-returns:false

配置RabbitTemplate和事务管理器

@ConfigurationpublicclassRabbitTemplateConfig{@Bean("transRabbitTemplate")publicRabbitTemplatetransRabbitTemplate(ConnectionFactory connectionFactory){RabbitTemplate rabbitTemplate =newRabbitTemplate(connectionFactory); rabbitTemplate.setChannelTransacted(true);return rabbitTemplate;}@BeanpublicRabbitTransactionManagerrabbitTransactionManager(ConnectionFactory connectionFactory){returnnewRabbitTransactionManager(connectionFactory);}}

配置队列

@ConfigurationpublicclassRabbitMQConfig{@Bean("transQueue")publicQueuetransQueue(){returnQueueBuilder.durable(Constants.TRANS_QUEUE).build();}}

2.消息限流

消息限流(Flow Control) 是RabbitMQ防止生产者发送消息速度超过消费者处理能力,导致消息积压和系统崩溃的保护机制

发送消息

@RestController@RequestMapping("/producer")publicclassProducerController{@Resource(name ="rabbitTemplate")privateRabbitTemplate rabbitTemplate;@RequestMapping("/qos")publicStringqos(){for(int i =0; i <20; i++){ rabbitTemplate.convertAndSend(Constants.QOS_EXCHANGE,"qos","qos test:"+ i);}return"发送成功";}}

配置消费者

@Component@Slf4jpublicclassQosListener{@RabbitListener(queues =Constants.QOS_QUEUE)publicvoidhandMessage(Message message,Channel channel)throwsIOException{long deliveryTag = message.getMessageProperties().getDeliveryTag();try{ log.info("接收到消息:{},deliveryTag:{}",newString(message.getBody(),StandardCharsets.UTF_8), deliveryTag); log.info("处理成功");// channel.basicAck(deliveryTag, true); // 消费者不确认消息}catch(Exception e){ channel.basicNack(deliveryTag,true,true);}}}

限制每个消费者未确认的最大消息数

spring:rabbitmq:listener:simple:acknowledge-mode: manual # 消费者确认机制prefetch:5

声明和配置交换器、队列和绑定关系

@ConfigurationpublicclassRabbitMQConfig{@Bean("qosQueue")publicQueueqosQueue(){returnQueueBuilder.durable(Constants.QOS_QUEUE).build();}@Bean("qosExchange")publicDirectExchangeqosExchange(){returnExchangeBuilder.directExchange(Constants.QOS_EXCHANGE).build();}@Bean("qosBinding")publicBindingqosBinding(@Qualifier("qosExchange")DirectExchange directExchange,@Qualifier("qosQueue")Queue queue){returnBindingBuilder.bind(queue).to(directExchange).with("qos");}}
在这里插入图片描述

Read more

MySQL 分库分表详解(含实践示例)

MySQL 分库分表详解(含实践示例)

十分想念顺店杂可。。。 分库分表是应对 MySQL 单库单表瓶颈的核心手段,通过拆分数据分散存储和访问压力。本文从拆分维度、实现方式、实践示例到关键挑战进行全面梳理,帮助理解和落地分库分表方案。 一、按拆分维度分类 1. 垂直分表(Column Sharding) 定义 将单表中字段按访问频率和关联性拆分到多个表,各表共享同一主键,业务上属于同一主体。 适用场景 * 单表字段过多(如超过 50 个),查询时加载冗余字段导致 IO 效率低; * 存在大字段(text、blob)或低频访问字段,拖慢核心查询; * 字段访问频率差异显著(如用户核心信息 vs 扩展资料)。 优缺点 优点缺点减少单表字段数,降低 IO 成本需维护多表关联,增加 join 操作核心字段与大字段分离,提升查询效率跨表查询增加业务复杂度表结构更贴合业务模块- 实践示例 -- 原用户表(字段冗余) CREATE

By Ne0inhk
Linux 系统 MySQL 完整安装配置教程:从卸载 MariaDB 到优化 my.cnf----《Hello MySQL!》(1)

Linux 系统 MySQL 完整安装配置教程:从卸载 MariaDB 到优化 my.cnf----《Hello MySQL!》(1)

文章目录 * 前言 * 卸载不要的环境 * 检查系统安装包 * 卸载这些包 * 安装MySQL官方yum源 * 使用程序 * 配置my.cnf * 引申:一些其他的指令 前言 在 Linux 系统中,许多发行版(如 CentOS 7)默认预装 MariaDB(MySQL 的分支项目),但在实际开发、部署场景中,我们常需要安装 MySQL 官方版本以满足特定兼容性或功能需求。然而,新旧数据库环境的冲突、YUM 源配置异常、初始密码登录、中文乱码等问题,往往成为新手入门的 “绊脚石”。 本文将从卸载冗余环境出发,一步步带你完成 MySQL 官方 YUM 源配置、服务器安装、服务启停、客户端登录(含 3 种密码解决方案)、核心配置文件(my.

By Ne0inhk
Spring Boot Actuator未授权访问漏洞 【原理扫描】修复

Spring Boot Actuator未授权访问漏洞 【原理扫描】修复

一、背景 漏洞名称:Spring Boot Actuator未授权访问漏洞 【原理扫描】 风险等级:中 详细描述: Actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块,借助于 Actuator 开发者可以很方便地对应用系统某些监控指标进行查看、统计等。在 Actuator 启用的情况下,如果没有做好相关权限控制,非法用户可通过访问默认的执行器端点(endpoints)来获取应用系统中的监控信息。 二、问题分析与复现 部署的微服务项目中,访问 http://ip:port/actuator 时,未受到任何权限控制,直接暴露了 Actuator 的接口信息。应用在生产环境中暴露了潜在的敏感信息,存在较大的安全隐患。 通过浏览器或命令行工具(如 curl)可以访问下面的端点: * /actuator/health * /actuator/env * /actuator/info

By Ne0inhk
Rust 性能优化全流程:从 flamegraph 定位瓶颈到 unsafe 与 SIMD 加速,响应快 2 倍

Rust 性能优化全流程:从 flamegraph 定位瓶颈到 unsafe 与 SIMD 加速,响应快 2 倍

👋 大家好,欢迎来到我的技术博客! 💻 作为一名热爱 Java 与软件开发的程序员,我始终相信:清晰的逻辑 + 持续的积累 = 稳健的成长。 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Rust这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Rust 性能优化全流程:从 flamegraph 定位瓶颈到 unsafe 与 SIMD 加速,响应快 2 倍 🚀 * 🔍 第一步:性能问题从何而来? * 📊 性能分析的“三步曲” * 📈 第二步:用 `criterion` 建立基准测试 * 🔥 第三步:用 `flamegraph` 可视化性能瓶颈 * 安装 `flamegraph` * 生成火焰图 * ✂️ 第四步:优化策略一 —— 减少内存分配 * 优化前:

By Ne0inhk