在《消息隊列在分佈式系統中的應用》一文中咱們介紹了消息隊列與分佈式系統二者間的密切關係以及消息隊列的應用場景。本篇以 RabbitMQ 爲例,繼續深刻了解消息隊列中間件的運行方式。html
AMQP(Advanced Message Queuing Protocol,高級消息隊列協議)是一個基於應用層的異步消息服務協議,爲面向消息的中間件設計提供了統一實現規範。AMQP 協議的目標是實現一種在全行業內普遍使用的標準消息中間件,解決衆多消息隊列供應商接口不統一的問題。RabbitMQ 就是使用 Erlang 編程語言開發的一個 AMQP 開源實現,是目前爲止部署最普遍的開源消息代理和消息隊列中間件。做爲一個企業級消息系統,RabbitMQ 支持多種編程語言和客戶端,而且自帶了集羣、管理、插件等功能,擁有着良好的高可用性、可擴展性和易用性。web
RabbitMQ 提供了詳盡的安裝文檔步驟,咱們能夠根據不一樣的操做系統類型來進行選擇。
以 Ubuntu 爲例,能夠執行安裝指令:編程
sudo apt-get install -yq rabbitmq-server
啓動 rabbitmq-server:bash
sudo service rabbitmq-server start
查看 Queues 列表:架構
sudo rabbitmqctl list_queues
在學習 RabbitMQ 的實際操做以前,首先須要掌握下列 RabbitMQ 的基本對象概念。
異步
是 RabbitMQ 的操做單元,由 Payload 有效負載和 Label 標籤兩部分組成,前者做爲消息的主體數據,後者則包含了消息路由轉發相關的描述數據。編程語言
負責生產消息,經過設定 Label 的內容來決定將消息投遞到指定隊列。分佈式
負責接收消息並執行相應的任務,消費者僅僅會關心消息的 Payload,而無需關心消息的 Label。消費者會從訂閱的隊列中獲取消息,若是有多個消費者訂閱了同一隊列,那麼隊列默認會以平攤的方式將消息分派給消費者。svg
是存放消息的地方,消息會在隊列中以 FIFO 的方式等待取出。學習
生產者和隊列之間的中轉站,充當路由器的功能,將消息路由到不一樣的隊列中,最後再被訂閱了該隊列的消費者取出。
爲隊列和交換機創建綁定關係,只有在確立了綁定關係以後,交換機纔會將消息路由到相應的隊列中,每個綁定關係都會包含有一個 Binding Key。
在綁定交換機和隊列時,會爲這次綁定設置一個 Key 值,做爲惟一標識。
消息的路由轉發描述,用做消息和隊列之間的匹配,會在隊列綁定到交換機時設置。同時,生產者在生產消息時也爲該消息指定一個路由鍵,以此來決定由將該消息存放到哪個隊列中。實際上 Routing Key 可能還須要結合 Exchange Type 以及 Binding Key 才能最終決定路由目標。
RabbitMQ 支持 fanout、direct、topic、headers 四種交換機類型,每種類型都具備特定的消息路由策略。
fanout exchange 扇形交換機:該類型交換機會無視路由鍵,將同一份消息路由給綁定到扇形交換機自身的全部隊列,因此扇形交換機採用的是廣播路由策略。也就是說同一份消息會被分發給不一樣的消費者,進而執行不一樣的任務。這一特性,很是符合「單一操做,多重響應」的場景,例如:Blog 系統中的一個新建博文操做,實際上須要完成新建博文記錄、更新文章計數、推送訂閱郵件等多種響應。
direct exchange 直連交換機:當隊列綁定到交換機以後,會爲這次綁定設置一個路由鍵。生產者將消息發送到交換機以前,也會爲消息設置一個路由鍵,直連交換機會經過匹配消息路由鍵與綁定路由鍵來肯定消息路由目標。因此直連交換機採用的是單播路由策略。
topic 主題交換機:在交換機與隊列創建綁定時,除了會設置路由鍵以外還會設置一個綁定鍵,並且綁定鍵支持通配符 *(單個字符) 和 #(任意個字符)兩種形式。主題交換機會經過匹配消息路由鍵和綁定鍵來肯定消息路由目標,也就是說同一個隊列可以接收不一樣路由鍵的消息(綁定鍵具備通配符),因此主題交換機是一種多播路由策略。須要注意的是,應用主題交換機時,消息的路由鍵命名格式應該是以 ’.’ 分割的單詞詞組。例如:路由鍵分別爲 task.add、task.sub、task.mult 的消息都會路由到綁定鍵爲 ‘task.#’ 的隊列中。
headers 頭交換機:頭交換機不會依賴路由鍵和綁定鍵做爲路由策略因素,而是單純的經過消息中所包含的 AMQP 協議頭信息來決定,該類型交換機由於效率問題,通常不多被用到。
本篇最爲《快速入門分佈式消息隊列之 RabbitMQ》的上篇主要介紹了 RabbitMQ 架構的對象概念,經過了解這些對象的概念,相信可以對 RabbitMQ 的運行機理有一個初步的認識。