当前位置: 首页 > 后端技术 > Java

面试官:RabbitMQ是如何实现消费端限流的

时间:2023-04-02 00:44:01 Java

您好!大家好,我是小七,不靠谱的程序员小七打算在轻松幽默的对话中分享一些技术。如果你觉得通过小七的文章有所收获,那就给小七点个赞吧。文章持续更新中1.前言RabbitMQ有很多高级特性,一般项目用不到,但总有面试官会问。当被问到时,我们不得不假装这些对我们来说都是微不足道的。2.面试面试官:小琪,请先做个自我介绍我:面试官你好,我毕业于XXX,之前在XXX工作,精通XXX。一句话,我优秀,你问就是了。面试官:好的,你的自我介绍很硬,让我看看你实力强不强。让我问你一个情景问题。例如,我们公司创建了一个秒杀系统。活动当天,用户下单过多,导致消费端崩溃。我们应该如何处理这种情况?我:那好吧,那就多买点服务器,多建几个消费端的服务,减轻服务器端的压力,这样就不会有问题了。面试官:嗯。..你说的确实可以解决。老实说,我们老板很挑剔。..我不愿意购买更多的服务器,所以我只想让我们的一台服务器来处理我:???让马跑,不让马吃草,这样行,告诉你老板,让他出来承担消费端的压力,他是不是舍不得花钱,让他等秒杀去给用户制造麻烦,使用户无法同时下单。面试官:哦不,我们也想过找用户麻烦,老板不同意。老板说用户必须在最短的时间内完成订单。我:对,那就用MQ让客户端下单,把订单信息放到消息队列里,让消费者端处理。面试官:哦,我们就是这么搞的,但是消费端老是崩溃。I:你们消费端的服务器配置怎么样?面试官:嗯。.消费者服务器配置为半核CPU,1G运行内存空间,10G磁盘空间。我:半核?开什么玩笑,让人拿走另一半的CPU?面试官:哎,情况是这样的,情况是这样的,反正公司穷,等你进来慢慢告诉你,你现在帮我想想办法,我可以拿来应对itBossme:那就在消费端实现限流吧。面试官:如何实现?我:使用channel.basicQos(intprefetchSize,intprefetchCount,booleanglobal)方法设置限流配置。prefetchSize:表示消息的大小(0表示无限大小)prefetchCount:表示消息的数量global:true表示channel下的所有消费者应用该策略,false表示只有当前消费者应用该策略。如图,这里我们channel.basicQos(0,1,false);意思是消息的大小没有限制,但是消息的条数是有限制的,一次只能给消费者发送一条消息。采访者:没有流量限制为什么消费端会被关闭?我:如果小明妈妈给小明吃10个饺子,小明叫了9个同学,那么一共10个,每个饺子一口吃没问题,但是小明是今天一个人,不能一下子往小明嘴里塞10个饺子,不然小明会噎死的。面试官:那怎么解决呢?我:现在小明先吃一个饺子,等小明吃完这个饺子,告诉他妈妈我吃完了,他妈妈再给他吃一个饺子。这样他就可以吃完10个饺子,小明就没事了。面试官:我看限流参数和数据大小是干什么用的。我:如果小明妈妈要让小明一口吃十个饺子,他就包一个很大的饺子,一斤重。假设还是个饺子,这个时候直接掐死小明吧,那么数据量应该也是有限制的。面试官:那队列怎么知道消费者消费完一条消息,要给他发另一条消息呢?我们需要配置消费者手动确认消息。当消费者消费完消息,手动确认消息后,队列就认为整个消费过程走完了,开始发送下一条消息。启用手动确认以在代码中配置手动确认。这里有两个手动确认的参数。第一个是tagnumber,就是这个消息的编号。第二个参数是是否确认多条消息。如果为true,则确认多条消息,如果为false,则只确认这条消息。一般来说,我们都是假的。采访者:是的,年轻人,我有事。我:请不要迷恋哥,哥只是个传说。..采访者:这个年轻人真是了不起。他立即解释了RabbitMQ消费者端的当前限制。你通过了面试,明天就可以开始工作了。我:啊,这么着急吗?采访者:别担心。你进来之后,慢慢听你说。如果你加班,让你告诉我。我:啊。..这个太难了4.总结RabbitMQ这里就不整理了,后面会继续更新文章,推荐收藏。文中涉及的命令必须像我一样多敲几次。只有在敲打的过程中,才能发现自己是否真正掌握了命令。如果觉得我的文章还不错,请点个赞。本文参与SegmentFault思维随笔《如何“反杀”面试官?如果您正在阅读,欢迎您加入。