標籤: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的整體架構一覽