RabbitMQ---事务和消息分发

(一).事务

1.概念

RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制。因此RabbitMQ也支持事务机制。Spring AMQP也提供了事务相关的操作。RabbitMQ事务允许开发者确保消息的发送和接收都是原子的。

2.使用事务

(1).配置事务管理器

(2).声明队列

这里我们直接使用内置的交换机即可

(3).生产者代码

(4).代码测试

可以查看,事务起作用了

注意:开启事务,配置事务管理器,添加@Transactional注解。这三步,一步也不能确。

(二).消息分发

1.概念

消息分发,解决的就是,当负载加重的时候,某些消费者消费苏队满,某些消费者消费速度快,就会导致消息积压,某些消费者空闲,进而应用整体的吞吐量下降。

我们可以使用channel.basicQos(int prefetchCount)方法,来限制当前信道上的消费者所能保持的最大未确认消息的数量。当发来消息的时候,RabbitMQ就会发送一条消息计数+1,消费一条消息,计数器-1,当达到上限的时候,RabbitMQ就不会在向它发送消息了,直到消费者确认了某条消息。类似于"滑动窗口"。主要应用场景为两个,一个是限流,一个是负载均衡。

2.限流

RabbitMQ可以控制消费端一次只能拉取N个请求。通过设置prefetchCount参数,同时必须设置消息应答方式为手动应答 。

prefetchCount : 控制消费者从队列中prefetch消息的数量,来实现流量控制和复杂均衡。

(1).配置prefetch参数,并设置应答方式为手动应答

(2)配置交换机和队列

(3).生产者

(4).消费者

注意:这里我们并没有进行ack确认

(5).测试结果

可以看到,有10条是nack的,就是没有进行手动确认的。有10条是ready的,是因为我们配置了最大未确认数量是10.

3.负载均衡

我们也可以通过消息分发来实现负载均衡。

一个消费者消费的快,一个消费者消费的慢,此时就会造成一个消费者一直在忙,一个消费者很闲。这是因为RabbitMQ只是在消息进入队列时分派消息,不考虑消费者未确认消息的数量。

我们可以设置prefetch=1的方式,告诉RabbitMQ一次只能给一个消费者一条消息,也就是说,在消费者处理并确认前一条消息之前,不再向该消费者发送消息。

(1).配置prefretch参数

(2).生产者

(3).消费者

(4).测试结果

可以发现,是可以实现的

相关推荐
叶总没有会10 小时前
RabbitMQ高级
分布式·rabbitmq
ABB自动化13 小时前
ABB 500CIM06 (1MRB150077R0111) | REB500 通信接口
大数据·分布式·系统架构·系统安全·模块测试·plc 控制器
ZENERGY-众壹13 小时前
告别本地工控机:分布式光伏 SCADA 架构如何实现云边协同
分布式·架构·光伏运维·能源数字化·电站监控
code_slave(码畜)13 小时前
微服务架构落地:读写分离架构 —— 主从延迟引发的“刚开单查不到”灾难与破局
spring boot·分布式·spring cloud·微服务·云原生·架构·读写分离
JAVA_AI人工智能项目实战15 小时前
分布式大模型训练_学习笔记
人工智能·分布式·语言模型·自然语言处理
星夜孤帆15 小时前
Redis缓存击穿与分布式锁实战:专栏目录、源码与实验说明
redis·分布式·缓存
yyk3332417 小时前
Spark介绍
大数据·分布式·spark
成为你的宁宁17 小时前
【基于 SSH 与 JNLP 协议的 Jenkins 分布式构建方案】
分布式·jenkins
PingCAP1 天前
善战者无赫赫之功:消费金融核心系统的数据库选型与升级路径
数据库·分布式·架构
库库的数据库笔记1 天前
金融核心交易系统的数据库国产信创改造该如何做?
大数据·数据库·分布式·mysql·oracle·金融·数据库架构