rabbitmq基礎(chǔ)

前言:之前一直沒(méi)有系統(tǒng)學(xué)習(xí)一下rabbitmq,只Google突擊學(xué)習(xí)一下就上手,最近在看《rabbitmq in action》,記一下理解后的要點(diǎn)。

常用腳本命令:

  • 前臺(tái)啟動(dòng):rabbitmq-server
  • 以后臺(tái)守護(hù)進(jìn)程啟動(dòng):rabbitmq-server -detached
  • 啟動(dòng)后查看狀態(tài):rabbitmqctl status
  • 停止節(jié)點(diǎn):rabbitmqctl stop ,包括rabbitmq和erlang,這個(gè)命令會(huì)優(yōu)雅關(guān)閉,rabbitmqctl會(huì)和本地節(jié)點(diǎn)通信指示其干凈關(guān)閉,也可以關(guān)閉不同的節(jié)點(diǎn),傳入-n rabbit@[hostname]
  • 只關(guān)閉rabbitmq,不關(guān)閉erlang:rabbitmqctl stop_app

默認(rèn)exchange:

剛開(kāi)始學(xué)的時(shí)候,并沒(méi)有關(guān)注exchange,但仍然能把消息發(fā)到隊(duì)列,這是因?yàn)橹付四J(rèn)路由器:

channel.basicPublish("", "hello", null, message.getBytes());

注意第一個(gè)參數(shù)設(shè)置了空字符串,就是指定了默認(rèn)exchange;第二個(gè)參數(shù)是已經(jīng)聲明了的queue的name,注意,queue可以自動(dòng)生成name:

String queueName = channel.queueDeclare().getQueue();

也可以自定義,但必須有個(gè)name綁定到exchange。

channel

一個(gè)tcp連接中存在多個(gè)channel。官方建議在一個(gè)多線程消費(fèi)者中,每個(gè)線程都對(duì)應(yīng)一個(gè)獨(dú)立的channel,不要在多個(gè)線程中共用一個(gè)channel

分發(fā)機(jī)制:

rabbitmq采用輪詢分發(fā)機(jī)制,也就是說(shuō),如果有2個(gè)消費(fèi)者a和b,a每5秒處理一條消息,b每一秒處理一條消息,生產(chǎn)者發(fā)了6條消息到隊(duì)列中,最終的結(jié)果是,a分發(fā)到3條消息用15秒處理了,b也分發(fā)到3條消息,3秒處理了,然后空閑等待,這明顯不合理。

如何解決?使用channel.basicQos(1),這個(gè)配置的意思是,rabbitmq每次只能發(fā)1條消息給輪詢到的消費(fèi)者,當(dāng)消費(fèi)者ack之后,才會(huì)再發(fā)下一條。

exchange:

  • fanout:這是廣播交換器交換器。比如聲明了一個(gè)廣播交換器q1,客戶端a,b,c,d分別創(chuàng)建了4個(gè)不同name的queue,并綁定到q1,q1會(huì)分別把消息分發(fā)到4個(gè)不同的queue。也就是說(shuō),廣播交換器不關(guān)心routing key,所有綁定的隊(duì)列,都會(huì)發(fā)
  • direct:direct交換器。比如聲明了一個(gè)direct交換器q2,客戶端a綁定一個(gè)隊(duì)列到q2,并聲明routing key = “error”,客戶端b綁定一個(gè)隊(duì)列到q2,并聲明routing key = “info”;那么客戶端a,b只會(huì)接收到對(duì)應(yīng)routing key的消息
  • topic:topic交換器。這個(gè)交換器規(guī)定routing key必須滿足a.a.a.a這種格式,并規(guī)定了2中通配符,*表示1個(gè)a;#可以表示多個(gè)a
    • 例如:routing key = *.a*,可以匹配b.a.c,但是無(wú)法匹配a.c,b.a,b.a.c.d
    • 例如:routing key = a.#,可以匹配a.b,a.b.c

vhost:多租戶模式。試想,你啟動(dòng)了一個(gè)rabbitmq服務(wù),它被應(yīng)用在很多功能模塊上,比如賬號(hào)服務(wù),訂單服務(wù),你要保證兩個(gè)服務(wù)的隊(duì)列是完全獨(dú)立的,再往后,服務(wù)越來(lái)越多,一個(gè)是要保證queue和exchange的命名不沖突,另一個(gè)是要區(qū)分不同的服務(wù),很麻煩,除非運(yùn)行多個(gè)rabbitmq。

vhost就類(lèi)似于虛擬機(jī),雖然只啟動(dòng)了一個(gè)rabbitmq集群,但是通過(guò)vhost,可以創(chuàng)建很多個(gè)虛擬的rabbitmq,之間相互隔離,每個(gè)虛擬的rabbitmq都有單獨(dú)的queue,exchange,和綁定關(guān)系

目前我知道的創(chuàng)建vhost方式只有通過(guò)rabbitmqctl命令或者通過(guò)web控制臺(tái)來(lái)創(chuàng)建。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容