RabbitMQ是目前很是熱門的一款消息中間件,不論是互聯網大廠仍是中小企業都在大量使用。做爲一名合格的開發者,有必要對RabbitMQ有所瞭解,本文是RabbitMQ快速入門文章,主要內容包括RabbitMQ是什麼、RabbitMQ核心概念、經常使用交換器類型、用Docker安裝RabbitMQ等。html
以熟悉的電商場景爲例,若是商品服務和訂單服務是兩個不一樣的微服務,在下單的過程當中訂單服務須要調用商品服務進行扣庫存操做。按照傳統的方式,下單過程要等到調用完畢以後才能返回下單成功,若是網絡產生波動等緣由使得商品服務扣庫存延遲或者失敗,會帶來較差的用戶體驗,若是在高併發的場景下,這樣的處理顯然是不合適的,那怎麼進行優化呢?這就須要消息隊列登場了。docker
消息隊列提供一個異步通訊機制,消息的發送者沒必要一直等待到消息被成功處理才返回,而是當即返回。消息中間件負責處理網絡通訊,若是網絡鏈接不可用,消息被暫存於隊列當中,當網絡暢通的時候在將消息轉發給相應的應用程序或者服務,固然前提是這些服務訂閱了該隊列。若是在商品服務和訂單服務之間使用消息中間件,既能夠提升併發量,又下降服務之間的耦合度。瀏覽器
RabbitMQ就是這樣一款咱們苦苦追尋的消息隊列。RabbitMQ是一個開源的消息代理的隊列服務器,用來經過普通協議在徹底不一樣的應用之間共享數據。安全
RabbitMQ是使用Erlang語言來編寫的,而且RabbitMQ是基於AMQP協議的。Erlang語言在數據交互方面性能優秀,有着和原生Socket同樣的延遲,這也是RabbitMQ高性能的緣由所在。可謂「人如其名」,RabbitMQ像兔子同樣迅速。服務器
RabbitMQ除了像兔子同樣跑的很快之外,還有這些特色:網絡
MQ典型應用場景:併發
提到RabbitMQ,就不得不提AMQP協議。AMQP協議是具備現代特徵的二進制協議。是一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。異步
先了解一下AMQP協議中間的幾個重要概念:微服務
咱們徹底能夠直接使用 Connection 就能完成信道的工做,爲何還要引入信道呢?高併發
試想這樣一個場景, 一個應用程序中有不少個線程須要從 RabbitMQ 中消費消息,或者生產消息,那麼必然須要創建不少個 Connection,也就是許多個 TCP 鏈接。然而對於操做系統而言,創建和銷燬 TCP 鏈接是很是昂貴的開銷,若是遇到使用高峯,性能瓶頸也隨之顯現。 RabbitMQ 採用 TCP 鏈接複用的方式,不只能夠減小性能開銷,同時也便於管理 。
下圖是AMQP的協議模型:
正如圖中所看到的,AMQP協議模型有三部分組成:生產者、消費者和服務端。
生產者是投遞消息的一方,首先鏈接到Server,創建一個鏈接,開啓一個信道;而後生產者聲明交換器和隊列,設置相關屬性,並經過路由鍵將交換器和隊列進行綁定。同理,消費者也須要進行創建鏈接,開啓信道等操做,便於接收消息。
接着生產者就能夠發送消息,發送到服務端中的虛擬主機,虛擬主機中的交換器根據路由鍵選擇路由規則,而後發送到不一樣的消息隊列中,這樣訂閱了消息隊列的消費者就能夠獲取到消息,進行消費。
最後還要關閉信道和鏈接。
RabbitMQ是基於AMQP協議實現的,其結構以下圖所示,和AMQP協議簡直就是如出一轍。
RabbitMQ經常使用的交換器類型有direct、topic、fanout、headers四種。
Direct Exchange
該類型的交換器將全部發送到該交換器的消息被轉發到RoutingKey指定的隊列中,也就是說路由到BindingKey和RoutingKey徹底匹配的隊列中。
Topic Exchange
該類型的交換器將全部發送到Topic Exchange的消息被轉發到全部RoutingKey中指定的Topic的隊列上面。
Exchange將RoutingKey和某Topic進行模糊匹配,其中「」用來匹配一個詞,「#」用於匹配一個或者多個詞。例如「com.#」能匹配到「com.rabbitmq.oa」和「com.rabbitmq」;而"login."只能匹配到「com.rabbitmq」。
Fanout Exchange
該類型不處理路由鍵,會把全部發送到交換器的消息路由到全部綁定的隊列中。優勢是轉發消息最快,性能最好。
Headers Exchange
該類型的交換器不依賴路由規則來路由消息,而是根據消息內容中的headers屬性進行匹配。headers類型交換器性能差,在實際中並不經常使用。
在雲計算和容器技術大熱的今天,不會Docker顯得未免太out了吧。Docker提供一種安全、可重複的環境中自動部署軟件的方式,本文使用Docker進行安裝RabbitMQ。
我選擇3.8.0-beta.4-management進行安裝,帶有management是含有管理界面的。
拉取鏡像和啓動:docker run -d --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.8.0-beta.4-management
查看鏡像:
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/rabbitmq 3.8.0-beta.4-management d0f93d2b83f7 3 days ago 180 MB
打開瀏覽器訪問localhost:15672,若是你和我同樣裝在虛擬機上面的話,須要打開虛擬機ip:15672
進行填寫帳號密碼:默認帳號密碼都是guest.
到此,RabbitMQ已經安裝並運行起來了。
本文介紹了RabbitMQ是什麼、RabbitMQ核心概念、經常使用交換器類型、用Docker安裝RabbitMQ等內容,看完本文,想必對於RabbitMQ已經有了一些初步的瞭解了,後面的世界更精彩。
本文參考慕課網免費課程:《RabbitMQ消息中間件極速入門與實戰》。
原文出處:https://www.cnblogs.com/sgh1023/p/11217017.html