前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >13-RabbitMQ高级特性-消费端限流

13-RabbitMQ高级特性-消费端限流

作者头像
Devops海洋的渔夫
发布2022-11-22 09:49:05
4130
发布2022-11-22 09:49:05
举报
文章被收录于专栏:Devops专栏

13-RabbitMQ高级特性-消费端限流

消费端限流

当用户的请求突然增多,MQ可以配置消费端限流,让消息按照限制的数量进行消费,达到限流的效果。

下面我们来代码案例演示。

案例

我们接着在前面篇章的工程来进行代码演示即可。

1.配置 消费端限流

  • 首先需要确保ack机制为手动确认 acknowledge="manual"
  • 配置消费端每次消费的数量 prefetch="1"
代码语言:javascript
复制
<!--  定义监听器与队列的绑定  -->
<rabbit:listener-container connection-factory="connectionFactory" acknowledge="manual" prefetch="1">
    <rabbit:listener ref="ackListener" queue-names="test_queue_confirm"/>
</rabbit:listener-container>

2.编写监听器类

代码语言:javascript
复制
package com.lijw.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;


/**
 * Consumer 限流机制
 *  1. 确保ack机制为手动确认。
 *  2. listener-container配置属性
 *      perfetch = 1,表示消费端每次从mq拉去一条消息来消费,直到手动确认消费完毕后,才会继续拉去下一条消息。
 *
 * @author Aron.li
 * @date 2022/3/4 23:36
 */
@Component
public class QosListener implements ChannelAwareMessageListener {

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {

        //1. 接收消息
        System.out.println(new String(message.getBody()));

        //2. 处理业务逻辑
        System.out.println("处理业务逻辑...");
        Thread.sleep(1000);

        //3. 手动签收
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);

    }

}

3.绑定 监听器类 与 队列

代码语言:javascript
复制
<!--  定义监听器与队列的绑定  -->
<rabbit:listener-container connection-factory="connectionFactory" acknowledge="manual" prefetch="1">
    <rabbit:listener ref="qosListener" queue-names="test_queue_confirm"/>
</rabbit:listener-container>

4.测试 能否正常接收到消息

首先我们在生产者端发送10条消息:

我们在消费端查看接收的消息情况:

5.测试拒绝 Ack 确认消息

上面的测试中,我们在消费端签收了消息,所以消息在逐条处理,如果我们不签收的话,那么将会卡在当前消息上,不会继续往下取消息:

生产端再发送10条消息,再次重启消费端:

从上面的效果来看,已经达到了限流效果了,只要前面的消息没有处理完毕,则不会取更多的消息来处理。

消费端限流小结

代码语言:javascript
复制
- 在<rabbit:listener-container> 中配置 prefetch属性设置消费端一次拉取多少消息

- 消费端的确认模式一定为手动确认。acknowledge="manual"
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 13-RabbitMQ高级特性-消费端限流
    • 消费端限流
      • 案例
        • 1.配置 消费端限流
        • 2.编写监听器类
        • 3.绑定 监听器类 与 队列
        • 4.测试 能否正常接收到消息
        • 5.测试拒绝 Ack 确认消息
      • 消费端限流小结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档