【146期】面试官问:说一说 RabbitMQ 的几种工作模式和优化建议?
點(diǎn)擊上方“Java精選”,選擇“設(shè)為星標(biāo)”
別問別人為什么,多問自己憑什么!
下方留言必回,有問必答!
每天?08:00?更新文章,每天進(jìn)步一點(diǎn)點(diǎn)...
1.組件介紹
Broker:它提供一種傳輸服務(wù),它的角色就是維護(hù)一條從生產(chǎn)者到消費(fèi)者的路線,保證數(shù)據(jù)能按照指定的方式進(jìn)行傳輸。
Exchange:消息交換機(jī),它指定消息按什么規(guī)則,路由到哪個隊(duì)列。
Queue:消息的載體,每個消息都會被投到一個或多個隊(duì)列。
Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來。
Routing Key:路由關(guān)鍵字,exchange根據(jù)這個關(guān)鍵字進(jìn)行消息投遞。
vhost:虛擬主機(jī),一個broker里可以有多個vhost,用作不同用戶的權(quán)限分離。
Producer:消息生產(chǎn)者,就是投遞消息的程序。
Consumer:消息消費(fèi)者,就是接受消息的程序。
Channel:消息通道,在客戶端的每個連接里,可建立多個channel。
2.消息發(fā)布和接收流程
一.如何發(fā)送消息
生產(chǎn)者和Broker建立TCP連接;
生產(chǎn)者和Broker建立通道;
生產(chǎn)者通過通道消息發(fā)送給Broker,由Exchange將消息進(jìn)行轉(zhuǎn)發(fā);
Exchange將消息轉(zhuǎn)發(fā)到止跌那個的Queue(隊(duì)列)。
二.如何接收消息
消費(fèi)者和Broker建立TCP連接;
消費(fèi)者和Broker建立通道;
消費(fèi)者監(jiān)聽制定的Queue(隊(duì)列);
當(dāng)有消息到達(dá)Queue時Broker默認(rèn)將消息推送給消費(fèi)者;
消費(fèi)者接受到消息。
3.工作模式
1. Direct 廣播模式
是最簡單的模式.即創(chuàng)建消息隊(duì)列的時候,指定一個路由鍵(RoutingKey)。當(dāng)發(fā)送者發(fā)送消息的時候,指定對應(yīng)的Key。當(dāng)Key和消息隊(duì)列的RoutingKey一致的時候,消息將會被發(fā)送到該消息隊(duì)列中。推薦:Java進(jìn)階學(xué)習(xí)資料。
2.Topic 主題交換區(qū)模式
topic轉(zhuǎn)發(fā)信息主要是依據(jù)通配符,隊(duì)列和交換機(jī)的綁定主要是依據(jù)一種模式(通配符+字符串),而當(dāng)發(fā)送消息的時候,只有指定的Key和該模式相匹配的時候,消息才會被發(fā)送到該消息隊(duì)列中.通配符:*?表示一個詞,#?表示零個或多個詞
3.fanout是路由廣播的形式
fanout是路由廣播的形式,將會把消息發(fā)給綁定它的全部隊(duì)列,即便設(shè)置了key,也會被忽略。因此我們發(fā)送到交換機(jī)的消息會使得綁定到該交換機(jī)的每一個Queue接收到消息,這個時候就算指定了路由鍵(routingKey),或者規(guī)則(即上文中convertAndSend方法的參數(shù)2),也會被忽略!
4.RabbitMQ優(yōu)化建議
1、加大服務(wù)器帶寬
訪問量大時,較長的數(shù)據(jù)容易將帶寬占滿。如服務(wù)器上傳帶寬為10M,則實(shí)際上傳帶寬可認(rèn)為1M,每秒上傳量為1M/1K=1K。如果把帶寬加到100M,則每秒上傳量為10K。一般情況下,RabbitMq服務(wù)器能夠接受的每秒寫入量為20K-50K(8G內(nèi)存),因此在帶寬在不足200M的時候,加大帶寬會產(chǎn)生很明顯的提升作用,再往上效果就可能不那么明顯了。推薦:Java進(jìn)階學(xué)習(xí)資料。
2、加大內(nèi)存
RabbitMq的機(jī)制是先將消息放在內(nèi)存中,然后分批寫入硬盤。小批量數(shù)據(jù)的寫入基本上都放在內(nèi)存中,內(nèi)存數(shù)據(jù)量過大時會一邊把客戶端的數(shù)據(jù)往內(nèi)存里寫,一邊將內(nèi)存里的陳舊數(shù)據(jù)往硬盤里寫,這樣會對速度造成較嚴(yán)重的損耗。適度的增加內(nèi)存,隊(duì)列將會更多的消息放在內(nèi)存中,增加系統(tǒng)的處理速度。
3、使用固態(tài)硬盤
機(jī)械硬盤的寫入速度較慢,處理大量數(shù)據(jù)時機(jī)械硬盤對性能的損耗十分嚴(yán)重。如果要存放1億條數(shù)據(jù),所需要的硬盤大小為100G,建議采用100-500G固態(tài)硬盤。再加上消費(fèi)端在不斷的處理數(shù)據(jù),一般待處理的消息能夠達(dá)到千萬級別已經(jīng)相當(dāng)不容易了
4、增加生產(chǎn)者
服務(wù)器可以建立多個連接,單個生產(chǎn)者往往不能充分利用服務(wù)器的潛能,建立多個生產(chǎn)者之后,服務(wù)器處理能力將會得到充分利用。一般情況下,一個生產(chǎn)者每秒可以傳入1000-5000條消息,在1-10這個范圍內(nèi),每增加一個生產(chǎn)者,處理速度就會相對單生產(chǎn)者增加一倍
5、增加消費(fèi)者
消費(fèi)者增多時,出隊(duì)速度有明顯改善。該方案對于出隊(duì)速度的影響有限,1-10個進(jìn)程范圍內(nèi),相對于單進(jìn)程只有一倍左右的提升,建議線程開2-5個即可,再多可能影響不大。出現(xiàn)該現(xiàn)象的原因可能是服務(wù)器帶寬或硬件處理能力有限,消費(fèi)者增加了也沒什么用處。因?yàn)闆]有實(shí)際環(huán)境測試,此條只列為建議,采用前可以多做實(shí)驗(yàn)
6、改網(wǎng)絡(luò)訪問為本地訪問
該方案在消費(fèi)端/生產(chǎn)端與RabbitMq服務(wù)器部署在同一臺電腦時有用,因?yàn)槭÷粤司W(wǎng)絡(luò)傳輸,大大節(jié)省了處理時間。如果消費(fèi)端/生產(chǎn)端與RabbitMq服務(wù)器分開部署,該方案就不能使用了。在代碼中將IP地址127.0.0.1改為localhost即可。
作者:精誠所至金石為開
blog.csdn.net/smartsteps/article/details/107002567
精品資料,超贊福利!
>Java精選面試題<
3000+ 道面試題在線刷,最新、最全 Java 面試題!
期往精選??點(diǎn)擊標(biāo)題可跳轉(zhuǎn)
【138期】手?jǐn)] websocket + netty 實(shí)時視頻彈幕交互功能(Java版附源碼)
【139期】面試官問:一般后端接口都測試什么?怎么測?
【140期】阿里技術(shù)經(jīng)理問:ReadWriteLock 讀寫之間互斥嗎?
【141期】JDK8 Stream 操作 collectingAndThen:根據(jù)對象的屬性去重
【142期】List 中 remove() 方法的“陷阱”,被坑慘了!
【143期】面試官問:說一說 Spring 和 Spring Boot 核心的 3 大區(qū)別?
【144期】拼多多面試官問:假設(shè)使用 Redis, 如何統(tǒng)計(jì)獨(dú)立用戶訪問量?
【145期】面試官:Java 數(shù)組中 new Object[5] 語句是否創(chuàng)建了 5 個對象?
文章有幫助的話,在看,轉(zhuǎn)發(fā)吧!
總結(jié)
以上是生活随笔為你收集整理的【146期】面试官问:说一说 RabbitMQ 的几种工作模式和优化建议?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7热点设置
- 下一篇: 踩坑:重写了alert方法,在点击事件中