高并发场景下生产者产生大量的消息,对于巨量的消息瞬间推送消费端无法处理

rabbitmq提供了服务质量保障功能,即在非自动确认消息的前提下,如果一定数目的消息未被确认,不进行消费新的消息。

使用 basicqos方法。在消费端进行使用。 0 1 false
prefetSize:0
prefetCount:这个值一般在设置为非自动ack的情况下生效,一般大小为1
global: true是channel级别, false是消费者级别
注意:我们要使用非自动ack

消费者:

package com.flying.rabbitmq.api.limit;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Consumer {public static void main(String[] args) throws Exception {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();String exchangeName = "test_qos_exchange";String queueName = "test_qos_queue";String routingKey = "qos.#";channel.exchangeDeclare(exchangeName, "topic", true, false, null);channel.queueDeclare(queueName, true, false, false, null);channel.queueBind(queueName, exchangeName, routingKey);//1 限流方式  第一件事就是 autoAck设置为 false
        channel.basicQos(0, 1, false);channel.basicConsume(queueName, false, new MyConsumer(channel));}
}

自定义消费监听

package com.flying.rabbitmq.api.limit;import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;import java.io.IOException;public class MyConsumer extends DefaultConsumer {private Channel channel ;public MyConsumer(Channel channel) {super(channel);this.channel = channel;}@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.err.println("-----------consume message----------");System.err.println("consumerTag: " + consumerTag);System.err.println("envelope: " + envelope);System.err.println("properties: " + properties);System.err.println("body: " + new String(body));// TODO 第二个参数设置为false,因为消费者设置的为prefetCount1//2手工签收channel.basicAck(envelope.getDeliveryTag(), false);}}

生产者:

package com.flying.rabbitmq.api.limit;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Producer {public static void main(String[] args) throws Exception {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();String exchange = "test_qos_exchange";String routingKey = "qos.save";String msg = "Hello RabbitMQ QOS Message";for(int i =0; i<5; i ++){channel.basicPublish(exchange, routingKey, true, null, msg.getBytes());}}
}

转载于:https://www.cnblogs.com/lflying/p/11107380.html

RabbitMQ的消费限流相关推荐

  1. 网络通道数2的倍数_限流笔记-通道限流(二)

    在工作中的时候,由于我负责的一个系统需要调用很多的第3方的系统,可是呢,这些个第3方的系统的性能完全不一致,有的好有的坏,还成本都不一样,当然了平时把,直接使用成本低的就行了,但是如果高并发的请求来的 ...

  2. 面试官:说说RabbitMQ 消费端限流、TTL、死信队列

    欢迎关注方志朋的博客,回复"666"获面试宝典 1. 为什么要对消费端限流 假设一个场景,首先,我们 Rabbitmq 服务器积压了有上万条未处理的消息,我们随便打开一个消费者客户 ...

  3. RabbitMQ(八):SpringBoot 整合 RabbitMQ(三种消息确认机制以及消费端限流)

    说明 本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同时消费端也采取了限流的措施, ...

  4. RabbitMQ(七):RabbitMQ 消费端限流、TTL、死信队列是什么?

    消费端限流 1. 为什么要对消费端限流 假设一个场景,首先,我们 Rabbitmq 服务器积压了有上万条未处理的消息,我们随便打开一个消费者客户端,会出现这样情况: 巨量的消息瞬间全部推送过来,但是我 ...

  5. RabbitMQ 消费端限流、TTL、死信队列

    目录 消费端限流 1. 为什么要对消费端限流 2.限流的 api 讲解 3.如何对消费端进行限流 TTL 1.消息的 TTL 2.队列的 TTL 死信队列 实现死信队列步骤 总结 消费端限流 1. 为 ...

  6. rabbitmq 不同的消费者消费同一个队列_RabbitMQ 消费端限流、TTL、死信队列

    消费端限流 1. 为什么要对消费端限流 假设一个场景,首先,我们 Rabbitmq 服务器积压了有上万条未处理的消息,我们随便打开一个消费者客户端,会出现这样情况: 巨量的消息瞬间全部推送过来,但是我 ...

  7. 消息中间件--RabbitMQ --- 消费端限流 -- 非常重要

    什么是消费端的·限流? 假设一个场景,首先,我们Rabbitmq服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面的情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法同时处理 ...

  8. Rabbitmq专题:rabbitmq消费端如何做限流?

    文章目录 1. 什么是消费端的限流? 2. 解决方案 3. 代码示例 1. 什么是消费端的限流? 场景:在订单高峰期,rabbitmq上已经堆积了很多消息等待消费,如果没有任何限流措施,贸然启动一个消 ...

  9. 面试官:RabbitMQ怎么实现消费端限流

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...

最新文章

  1. [译] Bob,函数式编程是什么鬼?
  2. 在Ubuntu下编译安装atom编辑器
  3. 微博深度学习平台架构和实践
  4. echarts画布_vue中动态设置echarts画布大小
  5. SQL2005中row_number()等函数的用法
  6. 20150103--SQL连接查询+视图-02
  7. 《趣学JavaScript——教孩子学编程》——2.4 Boolean
  8. 用上帝视角来看待组件的设计模式
  9. C/C++[PAT B level 1036]图形输出
  10. 求一个容器的最值的索引_初中几何最值——瓜豆原理模型分析
  11. 10款好用的程序员软件推荐
  12. 微信线下门店二维码扫码支付和退款
  13. php处理证件照_如何使用ps制作证件照
  14. 现代数据库及大数据管理—常见问题与技术归纳
  15. 计算机连接电视显示超范围,HDMI连接后电脑操作界面的边框超出电视屏幕,怎么解决...
  16. 高等数学术语英汉对照
  17. Star miscellaneous
  18. TwinCAT PLC 使用
  19. 阿飞学习mina框架
  20. FreeCAD编译、安装、开发环境

热门文章

  1. [转] SQL Server中变量的声明和使用方法
  2. js事件(Event)知识整理
  3. 2016搜狗:矩阵元素相乘
  4. springmvc+mybatis整合
  5. openSuse 13.1 的触摸板,回来了
  6. Asp.Net 创建MetaWeblog API
  7. map集合根据value找key,默认取第一个key
  8. Android OpenGL ES 入门系列(一) --- 了解OpenGL ES的前世今生
  9. 小米手机 DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs
  10. 网络配置命令优先级和元字符