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