☰
RabbitMQ---事务和消息分发
2026/10/1 21:07:11 网站建设 项目流程

(一).事务

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

可以发现,是可以实现的

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询