前言
RabbitMQ是基于AMQP協(xié)議(Advanced Message Queue Protocol)的消息中間件。
什么是消息隊列
消息隊列屬于進程間通信的一種方式,使用消息隊列可以通過異步方式處理數(shù)據(jù),借此可以提高系統(tǒng)性能。我們可以把消息當(dāng)作存放數(shù)據(jù)的容器,消息的消費者可以從隊列中獲取數(shù)據(jù),進行處理。常見的消息隊列有:ActiveMQ,RabbitMQ,Kafka,RocketMQ等。
RabbitMQ中用到基本概念
Broker:消息隊列的服務(wù)器實體。
Exchange:消息交換機,它指定消息按什么規(guī)則,路由到哪個隊列。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding:綁定,它主要是把exchange和queue按照路由規(guī)則綁定起來。
Routing Key:路由關(guān)鍵字,exchange根據(jù)這個關(guān)鍵字進行消息投遞。
vhost:虛擬主機,一個broker里可以開設(shè)多個vhost,用作不同用戶的權(quán)限分離。
producer:消息生產(chǎn)者,投遞消息的程序。
consumer:消息消費者,接收消息的程序。
channel:消息通道,在客戶端的每個連接里,可以建立多個channel,每個channel代表一個會話任務(wù)。
RabbitMQ中消息模式
1、簡單隊列
一個生產(chǎn)者對應(yīng)一個消費者。
2、工作隊列
一個生產(chǎn)者,多個消費者,一個消息只能發(fā)給一個消費者,spring中整合rabbitmq時,默認采用公平分發(fā)。
3、發(fā)布訂閱模式
傳遞一個消息到多個消費者中,借助該模式可以發(fā)布的消息將被廣播給所有接收者。
使用該模式需要借助交換機,生產(chǎn)者將消息發(fā)送到交換機,再通過交換機到達隊列。
RabbitMQ中有四種交換機:direct/topic/headers/fanout。默認交換機是direct,發(fā)布與訂閱的實現(xiàn)使用fanout。
使用交換機時,每個消費者有自己的隊列,生產(chǎn)者將消息發(fā)送到交換機(X),每個隊列都要綁定到交換機。
4、路由模式
生產(chǎn)者將消息發(fā)送到direct交換機(路由模式需要借助直連交換機實現(xiàn)),在綁定隊列和交換機的時候有一個路由key,生產(chǎn)者發(fā)送的消息會指定一個路由key,那么消息只會發(fā)送到相應(yīng)key相同的隊列,接著監(jiān)聽該隊列的消費者消費消息。也就是讓消費者有選擇性的接收消息。
5、主題模式
又稱通配符模式。
使用直連交換機可以改善我們的系統(tǒng),但是它仍有局限性,它不能實現(xiàn)多重條件的路由。在消息系統(tǒng)中,我們不僅想要訂閱基于路由鍵的隊列,還想訂閱基于生產(chǎn)消息的源,這時候可以使用topic交換機。
使用主題交換機時,路由鍵的語法形式是采用點分割的有意義的單詞。例如"goods.stock.info"。
其中:*星號代表一個單詞,#井號代表0個或多個單詞。