其實這篇博客,也算不上是什麼原理,只是將我知道的一些RabbitMQ的知識簡單羅列下,自從我來公司到現在,雖然一直都在用RabbitMQ,也一直想着把這塊總結下,卻一直在給自己找藉口,最近一段時間,覺得火候到了,也該總結總結這塊的東西了,算是給自己的一個交代吧。
不說其他的,說說RabbitMQ吧,RabbitMQ在我看來就是AMQP(Advanced Message Queuing Protocol)標準協議的一個實現,至於這個AMQP的標準協議具體是怎麼定的,我不太清楚,沒有深入的理解。都說RabbitMQ是一個很好的分佈式MQ,我想這也是因爲RabbitMQ是用Erlang語言開發出來的緣故,Erlang語言是專門爲開發concurrent和distribution系統的一種語言,它能很好的對分佈式和併發做支持,當然,我不會Erlang,所以具體的原理我也不知道了。
RabbitMQ主要是有這麼幾個部分,個人覺得這張圖能說明RabbitMQ:
Publisher:
是Message的生產者,Publisher這個Clients產生了一些Message。
Consumer:
Message的消費者,Publisher產生的Message,最終要到達Consumer這個Clients,進行消費。
Exchange:
指定消息按什麼規則,路由到哪個Queue,Message消息先要到達Exchange,在Server中承擔着從Produce接收Message的責任。
Queue:
到達Exchange的消息,根據制定的規則(Routing key)到達對應的Queue,在Server中承擔着裝載Message,是Message的容器,等待被消費出去。
Routing key:
在Exchange和Queue之間隱藏有一條黑線,可以將這條黑線看成是Routing key,Exchange就是根據這些定義好的Routing key將Message送到對應的Queue中去,是Exchange和Queue之間的橋樑。
Broker:
之前一直不理解這個Broker,其實Broker就是接收和分發消息的應用,也就是說RabbitMQ Server就是Message Broker。
VirtualHost:
虛擬主機,一個Broker裏可以開有多個VirtualHost,它的作用是用作不同用戶的權限分離。
Connection:
是Publisher/Consumer和Broker之間的TCP連接。斷開連接的操作只會在Publisher/Consumer端進行,Broker不會斷開連接,除非出現網絡故障或者Broker服務出現問題,Broker服務宕了。
Connection: Channel:
如果每一次訪問RabbitMQ就建立一個Connection,那在消息量大的時候建立TCP Connection的開銷就會很大,導致的後果就是效率低下。
左邊的Client向右邊的Client發送消息,流程:
第一:獲取Conection
第二:獲取Channel
第三:定義Exchange,Queue
第四:使用一個RoutingKey將Queue Binding到一個Exchange上
第五:通過指定一個Exchange和一個RoutingKey來將消息發送到對應的Queue上,
第六:Consumer在接收時也是獲取connection,接着獲取channel,然後指定一個Queue,到Queue上取消息,它對Exchange,RoutingKey及如何Binding都不關心,到對應的Queue上去取消息就行了。
一個Publisher Client發送消息,哪些Consumer Client可以收到消息,在於Exchange,RoutingKey,Queue的關係上。
RabbitMQ的簡單理論知識就介紹這麼多,下篇博客介紹RabbitMQ在CentoOS7上的安裝和配置。