面试官:RabbitMQ怎么实现消费端限流
哈喽!大家好,我是小奇,一位不靠谱的程序员
小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧
文章持续更新
一、前言
RabbitMQ有很多高级特性,一般项目用不到,但是总有面试官会问到,被问到的时候我们要假装这些对我们来说就是小意思一样。

二、面试
面试官:小奇是吧,你先做一个自我介绍吧
我:面试官您好,我毕业于XXX,我之前在XXX工作,我精通XXX,总之一句话,我就是优秀,你问就完了。

面试官:行,你的自我介绍很强硬啊,那我看看你到底有没有过硬的实力
我:是骡子是马拉出来溜溜

三、RabbitMQ怎么实现消费端限流
面试官:好,那我先问你一个场景题,比如我们公司现在做了一个秒杀系统,在活动当天用户下单太多了,造成消费端崩溃了,这种情况我们该怎么处理呢
我:好说呀,多买几台服务器,多搭建几台消费端的服务,减缓服务端的压力,这样不就没有问题了吗。
面试官:额。。。你这么说确实可以解决,实不相瞒我们老板特别抠。。。不舍得买更多的服务器,就想让我们一台服务器搞定
我:???光让马儿跑,不让马儿吃草,那特么能行啊,跟你们老板说,让他自己出来顶着消费端的压力吧,他不是不舍得花钱吗,等秒杀的时候让他去用户那里捣乱,让用户不能够同一时间下单不就行了。
面试官:哎呀不行呀,我们也想过给用户捣乱,但是老板不让,老板说必须让用户在最短的时间内都完成下单
我:可以啊,那就使用MQ,让客户端下单后将下单信息放入消息队列中,然后让消费端去处理呗。
面试官:哎呀我们就是这么弄的,但是消费端总是崩溃
我:你们消费端服务器配置怎么样?
面试官:嗯。。消费端服务器配置是半核CPU、1G运行内存空间、10G磁盘空间
我: 半核? 你特么在逗我,另外半个CPU让别人掰走了?
面试官:嘿嘿,情况就是这么个情况,事情就是这么个事情,反正公司就是穷困潦倒,等你进来了我再慢慢跟你讲,你现在先帮我想一个解决方案,我用来应付一下老板
我:那就在消费端实现限流吧。
面试官:怎么实现呢?
我:使用channel.basicQos(int prefetchSize, int prefetchCount, boolean global)方法来设置限流的配置。
prefetchSize:表示消息的大小(0的话表示不限制大小)
prefetchCount:表示消息的数量
global:true表示该通道下的所有消费者都适用这个策略,而false表示只有当前这一个消费者适用这个策略。

如图,这里我们channel.basicQos(0,1,false);表示不限制消息的大小,但是限制消息的数量,一次只能给消费者发送一条消息。
面试官:为什么不限流的话会将消费端搞挂掉呢
我:假如现在小明的妈妈有10个饺子给小明吃,小明叫来了9个同学,然后他们一共10个人,一人一个饺子都是一口就吃完了没有任何问题,但是今天就小明一个人,总不能10个饺子一下塞到小明的嘴里面吧,这样直接将小明噎死了。
面试官:那怎么解决呢
我:现在小明先吃一个饺子,等小明吃完了这一个饺子后告诉他妈,说我吃完了,然后他妈再给他一个饺子吃,这样的话也是可以吃完10个饺子的,并且小明没有事。
面试官:我看限流的参数还有数据大小是干什么的
我:假如现在小明妈妈为了让小明一口就吃完十个饺子,他包了一个特别大的饺子,有一斤重,这个时候跟小明说还是一个饺子,一口闷吧,这个时候照样将小明噎死了,所以数据大小也是要限制的。
面试官:那队列怎么知道消费者消费完了一条消息,要给他再发送一条消息呢
我们要配置消费端手动确认,当我们消费端消费完消息后手动确认消息,这个时候队列就认为整个消费流程走完了,就开始下一个信息的发送了。
开启手动确认配置

代码中手动确认。

这里手动确认有两个参数,第一个是tag编号,就是这个消息的一个编号,第二个参数为是否确认多条,true的话就是确认多条消息,false的话就是只确认这一条消息,一般我们都是false。
面试官:可以呀小伙子,有点东西
我:请你不要迷恋哥,哥只是一个传说。。。
面试官:小伙子真厉害啊,一下子就把RabbitMQ消费端限流讲明白了,你面试通过了,明天上岗吧
我:啊,这么急吗,我后面还有好多东西没有讲呢。
面试官:不着急,进来了以后慢慢听你讲,加班让你跟我讲
我:啊。。。这也太难了吧
四、总结
这里关于RabbitMQ还没有整理完毕,文章后面持续更新,建议收藏。
文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。
如果觉得我的文章还不错的话就点个赞吧
面试官:RabbitMQ怎么实现消费端限流的更多相关文章
- RabbitMQ 消费端限流、TTL、死信队列
		
目录 消费端限流 1. 为什么要对消费端限流 2.限流的 api 讲解 3.如何对消费端进行限流 TTL 1.消息的 TTL 2.队列的 TTL 死信队列 实现死信队列步骤 总结 消费端限流 1. 为 ...
 - SpringBoot 整合 RabbitMQ(包含三种消息确认机制以及消费端限流)
		
目录 说明 生产端 消费端 说明 本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同 ...
 - RabbitMQ消费端限流策略(十)
		
消费端限流: 什么是消费端限流? 场景: 我们RabbitMQ服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法同时处理这么 ...
 - Rabbitmq——实现消费端限流 --NACK重回队列
		
如果是高并发下,rabbitmq服务器上收到成千上万条消息,那么当打开消费端时,这些消息必定喷涌而来,导致消费端消费不过来甚至挂掉都有可能. 在非自动确认的模式下,可以采用限流模式,rabbitmq ...
 - Rabbitmq之高级特性——实现消费端限流&NACK重回队列
		
如果是高并发下,rabbitmq服务器上收到成千上万条消息,那么当打开消费端时,这些消息必定喷涌而来,导致消费端消费不过来甚至挂掉都有可能. 在非自动确认的模式下,可以采用限流模式,rabbitmq ...
 - jmeter压测IP欺骗绕过服务端限流
		
1.环境声明 jmeter3.0 后端为内网环境 2.检查内网闲置的ip 工具地址,无需复杂安装,解压点击就可以用啦~~ https://pan.baidu.com/s/1Yzs1vezfFMoy-m ...
 - 消费端ACK和重回队列
		
使用场景 消费端ACK和重回队列 消费端ACK使用场景: 1.消费端进行消费的时候,如果由于业务异常我们可以进行日志记录,然后进行补偿. 2.由于服务器宕机等严重问题,那我们就需要手工进行ACK保障消 ...
 - 服务接口API限流 Rate Limit
		
一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...
 - 简易RPC框架-客户端限流配置
		
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
 
随机推荐
- BUU [GKCTF 2021]签到
			
BUU [GKCTF 2021]签到 1.题目概述 2.解题过程 追踪HTTP流 在下面发现了一串可疑字符 Base16转base64 放到010里看看 复制下来,去转字符 好像不是,再回去找找其他的 ...
 - 通过Geth搭建私有以太坊网络
			
前言 为了进一步了解以太坊区块链网络的工作方式和运行原理,笔者通过官方软件Geth搭建了私有以太坊网络fantasynetwork,最终实现了单机和多机节点间的相互连通:首先通过VMware Work ...
 - Redis安装以及常见问题
			
安装 下载 redis官网地址:https://redis.io/ centos安装 创建软件放置目录mkdir soft 进入soft目录并下载redis安装包. cd soft wget http ...
 - Java基础—private、this关键字及get/set方法
			
Java基础-private\this关键字以及get\set方法 1.private关键字 private关键字通常用来修饰成员变量用来保护原有数据的安全,比如在下面学生类中 然后在测试类中调用成员 ...
 - java线程池之newFixedThreadPool定长线程池
			
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待. 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根 据系统的环境情况,可以 ...
 - SpringMVC前后端分离交互传参详细教程
			
温故而知新,本文为一时兴起写出,如有错误还请指正 本文后台基于SpringBoot2.5.6编写,前端基于Vue2 + axios和微信小程序JS版分别编写进行联调测试,用于理解前后端分离式开发的交互 ...
 - MySQL SQL Injection Cheat Sheet
			
MySQL SQL Injection Cheat Sheet Some useful syntax reminders for SQL Injection into MySQL databases- ...
 - python练习册 每天一个小程序 第0009题
			
1 ''' 2 题目描述: 3 找出一个html文件中所有的url 4 5 思路 : 6 利用正则表达式进行匹配 7 8 ''' 9 10 11 import re 12 13 14 with ope ...
 - swap分区扩展的三种方法
			
redhat linux swap分区扩展的三种方法 2016-12-26 11:41:08 分类: LINUX 原文地址:redhat linux swap分区扩展的三种方法 作者:quanshen ...
 - Unity-2D
			
Unity-2D 1.Unity中的2D模式: 1)游戏在二维上展示 启用 2D 模式时将会设置正交(即无透视)视图:摄像机沿 Z 轴观察,而 Y 轴向上增加.因此可以轻松可视化场景并放置 2D 对象 ...