RabbitMQ的幾種工作模式和優(yōu)化建議
點(diǎn)擊“藍(lán)字”,關(guān)注,置頂公眾號(hào)
每日技術(shù)干貨,第一時(shí)間送達(dá)!

1.組件介紹
Broker:它提供一種傳輸服務(wù),它的角色就是維護(hù)一條從生產(chǎn)者到消費(fèi)者的路線,保證數(shù)據(jù)能按照指定的方式進(jìn)行傳輸, Exchange:消息交換機(jī),它指定消息按什么規(guī)則,路由到哪個(gè)隊(duì)列。 Queue:消息的載體,每個(gè)消息都會(huì)被投到一個(gè)或多個(gè)隊(duì)列。 Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來. Routing Key:路由關(guān)鍵字,exchange根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息投遞。 vhost:虛擬主機(jī),一個(gè)broker里可以有多個(gè)vhost,用作不同用戶的權(quán)限分離。 Producer:消息生產(chǎn)者,就是投遞消息的程序. Consumer:消息消費(fèi)者,就是接受消息的程序. Channel:消息通道,在客戶端的每個(gè)連接里,可建立多個(gè)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ā)到止跌那個(gè)的Queue(隊(duì)列)
二.如何接收消息
消費(fèi)者和Broker建立TCP連接 消費(fèi)者和Broker建立通道 消費(fèi)者監(jiān)聽制定的Queue(隊(duì)列) 當(dāng)有消息到達(dá)Queue時(shí)Broker默認(rèn)將消息推送給消費(fèi)者 消費(fèi)者接受到消息
3.工作模式
1. Direct 廣播模式

是最簡(jiǎn)單的模式.即創(chuàng)建消息隊(duì)列的時(shí)候,指定一個(gè)路由鍵(RoutingKey).當(dāng)發(fā)送者發(fā)送消息的時(shí)候,指定對(duì)應(yīng)的Key.當(dāng)Key和消息隊(duì)列的RoutingKey一致的時(shí)候,消息將會(huì)被發(fā)送到該消息隊(duì)列中.
2.Topic 主題交換區(qū)模式

topic轉(zhuǎn)發(fā)信息主要是依據(jù)通配符,隊(duì)列和交換機(jī)的綁定主要是依據(jù)一種模式(通配符+字符串),而當(dāng)發(fā)送消息的時(shí)候,只有指定的Key和該模式相匹配的時(shí)候,消息才會(huì)被發(fā)送到該消息隊(duì)列中.通配符:*?表示一個(gè)詞,#?表示零個(gè)或多個(gè)詞
3.fanout是路由廣播的形式

fanout是路由廣播的形式,將會(huì)把消息發(fā)給綁定它的全部隊(duì)列,即便設(shè)置了key,也會(huì)被忽略.因此我們發(fā)送到交換機(jī)的消息會(huì)使得綁定到該交換機(jī)的每一個(gè)Queue接收到消息,這個(gè)時(shí)候就算指定了路由鍵(routingKey),或者規(guī)則(即上文中convertAndSend方法的參數(shù)2),也會(huì)被忽略!
4.RabbitMQ優(yōu)化建議
1、加大服務(wù)器帶寬
訪問量大時(shí),較長(zhǎng)的數(shù)據(jù)容易將帶寬占滿。如服務(wù)器上傳帶寬為10M,則實(shí)際上傳帶寬可認(rèn)為1M,每秒上傳量為1M/1K=1K。如果把帶寬加到100M,則每秒上傳量為10K。一般情況下,RabbitMq服務(wù)器能夠接受的每秒寫入量為20K-50K(8G內(nèi)存),因此在帶寬在不足200M的時(shí)候,加大帶寬會(huì)產(chǎn)生很明顯的提升作用,再往上效果就可能不那么明顯了。
2、加大內(nèi)存
RabbitMq的機(jī)制是先將消息放在內(nèi)存中,然后分批寫入硬盤。小批量數(shù)據(jù)的寫入基本上都放在內(nèi)存中,內(nèi)存數(shù)據(jù)量過大時(shí)會(huì)一邊把客戶端的數(shù)據(jù)往內(nèi)存里寫,一邊將內(nèi)存里的陳舊數(shù)據(jù)往硬盤里寫,這樣會(huì)對(duì)速度造成較嚴(yán)重的損耗。適度的增加內(nèi)存,隊(duì)列將會(huì)更多的消息放在內(nèi)存中,增加系統(tǒng)的處理速度。
3、使用固態(tài)硬盤
機(jī)械硬盤的寫入速度較慢,處理大量數(shù)據(jù)時(shí)機(jī)械硬盤對(duì)性能的損耗十分嚴(yán)重。如果要存放1億條數(shù)據(jù),所需要的硬盤大小為100G,建議采用100-500G固態(tài)硬盤。再加上消費(fèi)端在不斷的處理數(shù)據(jù),一般待處理的消息能夠達(dá)到千萬級(jí)別已經(jīng)相當(dāng)不容易了
4、增加生產(chǎn)者
服務(wù)器可以建立多個(gè)連接,單個(gè)生產(chǎn)者往往不能充分利用服務(wù)器的潛能,建立多個(gè)生產(chǎn)者之后,服務(wù)器處理能力將會(huì)得到充分利用。一般情況下,一個(gè)生產(chǎn)者每秒可以傳入1000-5000條消息,在1-10這個(gè)范圍內(nèi),每增加一個(gè)生產(chǎn)者,處理速度就會(huì)相對(duì)單生產(chǎn)者增加一倍
5、增加消費(fèi)者
消費(fèi)者增多時(shí),出隊(duì)速度有明顯改善。該方案對(duì)于出隊(duì)速度的影響有限,1-10個(gè)進(jìn)程范圍內(nèi),相對(duì)于單進(jìn)程只有一倍左右的提升,建議線程開2-5個(gè)即可,再多可能影響不大。出現(xiàn)該現(xiàn)象的原因可能是服務(wù)器帶寬或硬件處理能力有限,消費(fèi)者增加了也沒什么用處。因?yàn)闆]有實(shí)際環(huán)境測(cè)試,此條只列為建議,采用前可以多做實(shí)驗(yàn)
6、改網(wǎng)絡(luò)訪問為本地訪問
該方案在消費(fèi)端/生產(chǎn)端與RabbitMq服務(wù)器部署在同一臺(tái)電腦時(shí)有用,因?yàn)槭÷粤司W(wǎng)絡(luò)傳輸,大大節(jié)省了處理時(shí)間。如果消費(fèi)端/生產(chǎn)端與RabbitMq服務(wù)器分開部署,該方案就不能使用了。在代碼中將IP地址127.0.0.1改為localhost即可
來源:blog.csdn.net/smartsteps/article/details/107002567
往期推薦
