1. 程式人生 > 其它 >RabbitMQ的幾種工作模式和優化建議

RabbitMQ的幾種工作模式和優化建議

1.元件介紹

  1. Broker:它提供一種傳輸服務,它的角色就是維護一條從生產者到消費者的路線,保證資料能按照指定的方式進行傳輸,
  2. Exchange:訊息交換機,它指定訊息按什麼規則,路由到哪個佇列。
  3. Queue:訊息的載體,每個訊息都會被投到一個或多個佇列。
  4. Binding:繫結,它的作用就是把exchange和queue按照路由規則繫結起來.
  5. Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。
  6. vhost:虛擬主機,一個broker裡可以有多個vhost,用作不同使用者的許可權分離。
  7. Producer:訊息生產者,就是投遞訊息的程式.
  8. Consumer:訊息消費者,就是接受訊息的程式.
  9. Channel:訊息通道,在客戶端的每個連線裡,可建立多個channel.

2.訊息釋出和接收流程

一.如何傳送訊息

  1. 生產者和Broker建立TCP連線
  2. 生產者和Broker建立通道
  3. 生產者通過通道訊息傳送給Broker,由Exchange將訊息進行轉發
  4. Exchange將訊息轉發到止跌那個的Queue(佇列)

二.如何接收訊息

  1. 消費者和Broker建立TCP連線
  2. 消費者和Broker建立通道
  3. 消費者監聽制定的Queue(佇列)
  4. 當有訊息到達Queue時Broker預設將訊息推送給消費者
  5. 消費者接受到訊息

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