rabbitmq的整體架構一覽

來源:互聯網
上載者:User

標籤:rabbitmq的整體架構一覽

AMQ結構圖,工作原理圖

重要術語

Server(broker):接收用戶端串連,實現AMQP訊息佇列的路由功能的進程.簡單來說就是訊息佇列伺服器實體。

Vhost:虛擬機器主機,一個broker裡可以開設多個vhost,用作不同使用者的許可權分離。許可權控制組,使用者只能關聯到一個vhost上,一個vhost中可以有若干個Exchange和Queue,預設的vhost是"/"

Exchange:接收生產者發送的訊息,並根據Binding規則將訊息路由給伺服器中的隊列 Exchange Type決定了Exchange路由訊息額行為,例如,在RabbitMQ中,ExchangeType有Direct、Fanout和Topic三種,不同類型的Exchange路由得到行為是不一樣的

queue:用於儲存還未消費的訊息。訊息佇列載體,每個訊息都會被投入到一個或多個隊列。


Message:由Header和Body組成,Header是由生產者添加到各種屬性的集合,包括Message是否被持久化,是由哪個Message Queue接收優先順序是多少等,而Body是真正需要傳輸的APP資料

Binding: 綁定,它的作用就是把exchange和queue按照路由規則綁定起來。:

BindingKey: 在mq中設定的綁定key

Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。
producer:訊息生產者,就是投遞訊息的程式。

consumer:訊息消費者,就是接受訊息的程式。
channel:訊息通道,在用戶端的每個串連裡,可建立多個channel,每個channel代表一個會話任務


訊息佇列的使用過程大概如下:

(1)用戶端(生產者)串連到訊息佇列伺服器,開啟一個channel。
(2)用戶端聲明一個exchange,並設定相關屬性。
(3)用戶端聲明一個queue,並設定相關屬性。
(4)用戶端使用routing key,在exchange和queue之間建立好綁定關係。
(5)用戶端投遞訊息到exchange。

exchange接收到訊息後,就根據訊息的key和已經設定的binding,進行訊息路由,將訊息投遞到一個或多個隊列裡。


exchange也有幾個類型,完全根據key進行投遞的叫做Direct交換器,例如,綁定時設定了routing key為”abc”,那麼用戶端提交的訊息,只有設定了key為”abc”的才會投遞到隊列。對key進行模式比對後進行投遞的叫做Topic交換器,符號”#”匹配一個或多個詞,符號”*”匹配正好一個詞。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。還有一種不需要key的,叫做Fanout交換器,它採取廣播模式,一個訊息進來時,投遞到與該交換器綁定的所有隊列。



Direct:

任何發送到Direct Exchange的訊息都會被轉寄到routing_key中指定的Queue

1.一般情況可以使用rabbitMQ內建的Exchange:””(該Exchange的名字為空白字串);

2.這種模式下不需要將Exchange進行任何綁定(bind)操作;

3.訊息傳遞時需要一個“routing_key”,可以簡單的理解為要發送到的隊列名字;

4.如果vhost中不存在routing_key中指定的隊列名,則該訊息會被拋棄。

如代碼發送

import pikaconnection = pika.BlockingConnection(pika.ConnectionParameters(        host=‘localhost‘))channel = connection.channel()channel.queue_declare(queue=‘hello‘)channel.basic_publish(exchange=‘‘,                      routing_key=‘hello‘,                      body=‘Hello World!‘)print(" [x] Sent ‘Hello World!‘")connection.close()


650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/7F/A4/wKiom1cnDFLTXCwSAABHp8iu3JY906.png" title="rabbitmq1.png" alt="wKiom1cnDFLTXCwSAABHp8iu3JY906.png" />


Topic:

任何發送到Topic Exchange的訊息都會被轉寄到所有關心routing_key中指定話題的Queue上

1.這種模式較為複雜,簡單來說,就是每個隊列都有其關心的主題,所有的訊息都帶有一個“標題”(routing_key),Exchange會將訊息轉寄到所有關注主題能與routing_key模糊比對的隊列。

2.這種模式需要routing_key,也許要提前綁定Exchange與Queue。

3.在進行綁定時,要提供一個該隊列關心的主題,如“#.log.#”表示該隊列關心所有涉及log的訊息(一個routing_key為”MQ.log.error”的訊息會被轉寄到該隊列)。

4.“#”表示0個或若干個關鍵字,“*”表示一個關鍵字。如“log.*”能與“log.warn”匹配,無法與“log.warn.timeout”匹配;但是“log.#”能與上述兩者匹配。

5.同樣,如果Exchange沒有發現能夠與routing_key匹配的Queue,則會拋棄此訊息。


Fanout:

任何發送到Fanout Exchange的訊息都會被轉寄到與該Exchange綁定(Binding)的所有Queue上

1.可以理解為路由表的模式

2.這種模式不需要routing_key

3.這種模式需要提前將Exchange與Queue進行綁定,一個Exchange可以綁定多個Queue,一個Queue可以同多個Exchange進行綁定。

4.如果接受到訊息的Exchange沒有與任何Queue綁定,則訊息會被拋棄。

Demo中建立了一個將一個exchange和一個queue進行fanout類型的bind.但是發送資訊時沒有用到它,如果要用到它,只要在發送訊息時指定該exchange的名稱即可,該exchange就會將訊息發送到所有和它bind的隊列中。在fanout模式下,指定的routing_key是無效的 。


650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/7F/A4/wKiom1cnA5-DMxU4AAFSCPrEwxg023.jpg" title="rabbitmq_jiegou2.jpg" alt="wKiom1cnA5-DMxU4AAFSCPrEwxg023.jpg" />




rabbitMQ的兩個核心組件是exchange和queue

運行原理如:


650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/7F/A4/wKiom1cnA_vyd1yWAADXzkICro0688.jpg" title="rabbitmq_jiegou.jpg" alt="wKiom1cnA_vyd1yWAADXzkICro0688.jpg" />




本文出自 “崔德華營運打工從業路” 部落格,請務必保留此出處http://cuidehua.blog.51cto.com/5449828/1769486

rabbitmq的整體架構一覽

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.