深入理解和应用RabbitMQ的Work Queues模型
创始人
2024-11-11 12:35:39
0

当你在处理消息时,可能会遇到这样的问题:消息的生产速度远远大于消费速度,导致消息堆积。这时候,Work Queues(工作队列)模型就能派上用场。简单来说,Work Queues 让多个消费者绑定到一个队列,共同消费队列中的消息,从而加快消息处理速度。

1. 场景模拟

我们来模拟一个这样的场景。首先,在控制台创建一个名为 work.queue 的队列。

2. 消息发送

我们通过循环发送大量消息来模拟消息堆积的现象。在 publisher 服务中的 SpringAmqpTest 类中添加一个测试方法:

@Test public void testWorkQueue() throws InterruptedException {     // 队列名称     String queueName = "simple.queue";     // 消息     String message = "hello, message_";     for (int i = 0; i < 50; i++) {         // 发送消息,每20毫秒发送一次,相当于每秒发送50条消息         rabbitTemplate.convertAndSend(queueName, message + i);         Thread.sleep(20);     } } 
3. 消息接收

为了模拟多个消费者绑定同一个队列,我们在 consumer 服务的 SpringRabbitListener 中添加两个新的方法:

@RabbitListener(queues = "work.queue") public void listenWorkQueue1(String msg) throws InterruptedException {     System.out.println("消费者1接收到消息:【" + msg + "】" + LocalTime.now());     Thread.sleep(20); }  @RabbitListener(queues = "work.queue") public void listenWorkQueue2(String msg) throws InterruptedException {     System.err.println("消费者2........接收到消息:【" + msg + "】" + LocalTime.now());     Thread.sleep(200); } 

注意到这两个消费者都设置了 Thread.sleep 来模拟任务耗时:

  • 消费者1:Thread.sleep(20),相当于每秒处理50个消息。
  • 消费者2:Thread.sleep(200),相当于每秒处理5个消息。
4. 测试

启动 ConsumerApplication 后,执行 publisher 服务中编写的发送测试方法 testWorkQueue。结果如下:

消费者1接收到消息:【hello, message_0】21:06:00.869555300 消费者2........接收到消息:【hello, message_1】21:06:00.884518 ... 消费者1接收到消息:【hello, message_48】21:06:01.920702500 消费者2........接收到消息:【hello, message_49】21:06:05.723106700 

可以看到,消费者1和消费者2各自消费了25条消息:

  • 消费者1快速完成了任务。
  • 消费者2则缓慢处理任务。

消息是平均分配给每个消费者的,并没有考虑到各个消费者的处理能力,导致一个消费者空闲,另一个忙碌。这显然是低效的。

5. 能者多劳

spring 中,可以通过简单配置解决这个问题。修改 consumer 服务的 application.yml 文件,添加如下配置:

spring:   rabbitmq:     listener:       simple:         prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息 

再次测试,结果如下:

消费者1接收到消息:【hello, message_0】21:12:51.659664200 消费者2........接收到消息:【hello, message_1】21:12:51.680610 ... 消费者2........接收到消息:【hello, message_49】21:12:52.746299900 

这次,消费者1处理了更多的消息,消费者2则处理了较少的消息,总耗时在1秒左右,大大提升了效率。这充分利用了每一个消费者的处理能力,有效避免了消息积压问题。

6. 总结

Work Queues 模型的使用要点:

  • 多个消费者绑定到一个队列,同一条消息只会被一个消费者处理。
  • 通过设置 prefetch 来控制消费者预取的消息数量。

这样可以更高效地利用资源,提高消息处理速度。

相关内容

热门资讯

透视妙招!德普之星透视辅助,德... 您好,德普之星透视辅助这款游戏可以开挂的,确实是有挂的,需要了解加去威信【136704302】很多玩...
透视黑科技!sohoo竞技联盟... 透视黑科技!sohoo竞技联盟辅助器,微乐小程序辅助免费,揭幕透视(有挂工具)-哔哩哔哩sohoo竞...
第九分钟方针!情怀国粹麻将神器... 第九分钟方针!情怀国粹麻将神器,天酷游戏交易平台(辅助)好像是有平台(哔哩哔哩)1、天酷游戏交易平台...
透视解密!hhpoker怎么防... 透视解密!hhpoker怎么防作必弊,hh poker软件(透视)都是真的有神器(哔哩哔哩)1、这是...
透视策略!菠萝辅助器免费版的功... 透视策略!菠萝辅助器免费版的功能介绍,HHpoker机器人好像真的是有工具,1分钟教程(了解有挂)1...
透视软件!德普之星辅助器app... 透视软件!德普之星辅助器app,微乐智能插件激活码,解迷脚本(有挂透明挂)-哔哩哔哩1、让任何用户在...
第5分钟项目!多乐跑得私人房间... 第5分钟项目!多乐跑得私人房间作必弊视频,新超凡大厅辅助(辅助)切实真的有app(哔哩哔哩)1、超多...
透视揭幕!德普之星辅助器,德扑... 透视揭幕!德普之星辅助器,德扑圈透视(透视)原来存在有方法(哔哩哔哩)在进入软件靠谱后,参与本局比赛...
透视阶段!WePoKer辅助器... 透视阶段!WePoKer辅助器,WePoKer挂一直有脚本,第5分钟教程(有挂攻略)1、WePoKe...
第9分钟资料!开心泉州小程序开... 第9分钟资料!开心泉州小程序开挂有什么技巧,财神十三张安装工具(辅助)确实真的有软件(哔哩哔哩)1、...