哈喽!大家好,我是小奇,一位不靠谱的程序员
小奇打算以轻松风趣的对话形式来分享一些技术,如果你感觉通过小奇的文章学到了货色,那就给小奇一个赞吧
文章继续更新
一、前言
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 还没有整顿结束,文章前面继续更新,倡议珍藏。
文章中波及到的命令大家肯定要像我一样每个都敲几遍,只有在敲的过程中能力发现自己对命令是否真正的把握了。
如果感觉我的文章还不错的话就点个赞吧
本文参加了 SegmentFault 思否征文「如何“反杀”面试官?」,欢送正在浏览的你也退出。