一朴恳、什么是Exchange
RabbitMQ 是 AMQP(高級消息隊列協(xié)議)的標(biāo)準(zhǔn)實現(xiàn)
從 AMQP 協(xié)議可以看出,Queue贞绵、Exchange 和 Binding 構(gòu)成了 AMQP 協(xié)議的核心
- Producer:消息生產(chǎn)者恍飘,即投遞消息的程序。
- Broker:消息隊列服務(wù)器實體章母。
- Exchange:消息交換機(jī),它指定消息按什么規(guī)則彩郊,路由到哪個隊列蚪缀。
- Binding:綁定,它的作用就是把 Exchange 和 Queue 按照路由規(guī)則綁定起來询枚。
- Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列刷后。
- Consumer:消息消費(fèi)者,即接受消息的程序丧裁。
二含衔、Exchange的類型
RabbitMQ常用的Exchange Type有fanout、direct贪染、topic、headers這四種
fanout
fanout類型的Exchange路由規(guī)則非常簡單强经,它會把所有發(fā)送到fanout Exchange的消息都會被轉(zhuǎn)發(fā)到與該Exchange 綁定(Binding)的所有Queue上寺渗。
Fanout Exchange 不需要處理RouteKey 。只需要簡單的將隊列綁定到exchange 上炬称。這樣發(fā)送到exchange的消息都會被轉(zhuǎn)發(fā)到與該交換機(jī)綁定的所有隊列上涡拘。類似子網(wǎng)廣播,每臺子網(wǎng)內(nèi)的主機(jī)都獲得了一份復(fù)制的消息鳄乏。所以,F(xiàn)anout Exchange 轉(zhuǎn)發(fā)消息是最快的朽缴。
direct
direct類型的Exchange路由規(guī)則也很簡單水援,它會把消息路由到那些binding key
與routing key
完全匹配的Queue中。
direct Exchange是RabbitMQ Broker的默認(rèn)Exchange
或渤,它有一個特別的屬性對一些簡單的應(yīng)用來說是非常有用的奕扣,在使用這個類型的Exchange時,可以不必指定routing key
的名字成畦,在此類型下創(chuàng)建的Queue有一個默認(rèn)的routing key
,這個routing key
一般同Queue同名框仔。
direct模式,可以使用rabbitMQ自帶的Exchange:default Exchange 拄养。所以不需要將Exchange進(jìn)行任何綁定(binding)操作 。消息傳遞時跛梗,RouteKey必須完全匹配棋弥,才會被隊列接收,否則該消息會被拋棄顽染。
topic
前面講到direct類型的Exchange路由規(guī)則是完全匹配binding key
與routing key
,但這種嚴(yán)格的匹配方式在很多情況下不能滿足實際業(yè)務(wù)需求尼荆。topic類型的Exchange在匹配規(guī)則上進(jìn)行了擴(kuò)展唧垦,它與direct類型的Exchage相似,也是將消息路由到binding key
與routing key
相匹配的Queue中振亮,但這里的匹配規(guī)則有些不同,它約定:
-
routing key
為一個句點號“. ”分隔的字符串(我們將被句點號“. ”分隔開的每一段獨立的字符串稱為一個單詞)狞悲,如“stock.usd.nyse”妇斤、“nyse.vmw”、“quick.orange.rabbit” -
binding key
與routing key
一樣也是句點號“. ”分隔的字符串 -
binding key
中可以存在兩種特殊字符"*"與“#”荸恕,用于做模糊匹配死相,其中" * "用于匹配一個單詞,“#”用于匹配多個單詞(可以是零個)
所有發(fā)送到Topic Exchange的消息生宛,會拿routing key與binging key進(jìn)行模糊匹配。因此“l(fā)og.#”能夠匹配到“l(fā)og.info.oa”陷舅,但是“l(fā)og.*” 只會匹配到“l(fā)og.error”
headers
headers類型的Exchange不依賴于routing key與binding key的匹配規(guī)則來路由消息,而是根據(jù)發(fā)送的消息內(nèi)容中的headers屬性進(jìn)行匹配待讳。
在綁定Queue與Exchange時指定一組鍵值對仰剿;當(dāng)消息發(fā)送到Exchange時,RabbitMQ會取到該消息的headers(也是一個鍵值對的形式)南吮,對比其中的鍵值對是否完全匹配Queue與Exchange綁定時指定的鍵值對;如果完全匹配則消息會路由到該Queue汁针,否則不會路由到該Queue砚尽。