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).测试结果

可以发现,是可以实现的

相关推荐
方方洛2 天前
ray教程-28-附录G-CICD与Slurm与云上调度
人工智能·分布式·机器学习
空奈qwq2 天前
【Kafka 从入门到实战】从手写一个队列到生产级消息中间件:架构、分区、消费组、零拷贝全解析
分布式·架构·kafka
山甫aa3 天前
锁一篇搞定:乐观锁、悲观锁、CAS、数据库锁与分布式锁【从零开始的 Web 后端学习】
java·数据库·分布式·后端·学习·web
严肃小白兔4 天前
Cloudflare Durable Objects 支持自动重试:分布式调用如何避免重复执行?
分布式
Pniubi4 天前
基于RabbitMQ实现延迟队列
rabbitmq
方方洛4 天前
ray教程-27-附录F-RayClient与runtime_env与多语言
人工智能·分布式·机器学习
方方洛5 天前
ray教程-25-附录E-端到端实战案例
人工智能·分布式·机器学习
一条泥憨鱼6 天前
【消息队列】ACK确认了什么:消息队列可靠投递的完整链路
java·后端·kafka·消息队列·rabbitmq
迅翼SwiftWing6 天前
编队系列(二)|固定翼如何依靠邻居信息保持队形?一致性控制、通信拓扑与分布式仿真实现,附仿真代码
分布式