RabbitMQ的幾種工作模式和優化建議
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一致的時候,訊息將會被髮送到該訊息佇列中.
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的時候,加大頻寬會產生很明顯的提升作用,再往上效果就可能不那麼明顯了。
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