1. 程式人生 > >訊息中介軟體——RabbitMQ(三)理解RabbitMQ核心概念和AMQP協議!

訊息中介軟體——RabbitMQ(三)理解RabbitMQ核心概念和AMQP協議!

前言

本章學習,我們可以瞭解到以下知識點:

  • 網際網路大廠為什麼選擇RabbitMQ?
  • RabbiMQ的高效能之道是如何做到的?
  • 什麼是AMQP高階協議?
  • AMQP核心概念是什麼?
  • RabbitMQ整體架構模型是什麼樣子的?
  • RabbitMQ訊息是如何流轉的?

1. 初識RabbitMQ

RabbitMQ 是一個開源的訊息代理和佇列伺服器,用來通過普通協議在完全不同的應用之間共享資料(RabbitMQ能夠實現跨語言跨平臺的機制,),RabbitMQ是使用Erlang語言來編寫的,並且RabbitMQ是基於AMQP協議的。

僅僅通過上面一句話,相信大家一定有很多疑惑和問題。

  • RabbitM成熟度到底怎麼樣?
  • 業界使用度怎麼樣?哪些大廠在使用?為什麼?
  • 包括RabbitMQ到底都有哪些特點?
  • RabbitMQ為什麼要用Erlang語言去編寫?
  • 什麼是AMQP協議?AMQP協議裡面的具體的規範又是什麼?

我相信大家跟我一樣都會有這樣的疑惑。那麼我們一起來學習一RabbitMQ吧。

我們來了解第一個問題。

2. 網際網路大廠為什麼選擇RabbitMQ?

業界使用度怎麼樣?哪些大廠在使用?為什麼?都有哪些優點?
據我瞭解:滴滴、美團、去哪兒、頭條...

這些網際網路大廠都會採用RabbitMQ作為它底層的訊息通訊的一個基礎元件。根本原因:

  1. 開源、效能優秀、穩定性保障
  2. 提供可靠性訊息投遞模式(confirm)、返回模式(return)
  3. 與SpringAMQP完美的整合、擴充套件性變得更強、API豐富
  4. 叢集模式豐富、表示式配置、HA(高可用)模式、映象佇列模型
  5. 保證資料不丟失的前提下做到高可靠性、可用性

3. RabbiMQ的高效能之道是如何做到的?

原因就在於它使用了Erlang語言,Erlang語言最初在於交換機領域的架構模式,這樣使得RabbitQ在Broker之間進行資料互動的效能是非常優秀的。

還有一點也是取決於作者,RabbitMQ開發的作者在開發RabbitMQ之間,先用Erlang語言做了一個簡單的交換機,然後他驚奇的發現:Erlang的優點:Erlang有著和原生Socket一樣好的延遲效果。
相信大家接觸過Socket的朋友,對它的有怎樣的效能有一定的瞭解。像我們耳熟能詳的RPC通訊框架。比如說:dubbo,它底層就是採用了Netty,Netty無非就是網路程式設計中的高效能之王,它無非就是一個Socket。
基於這個特點呢,我們就有了一個充分的選擇RabbitMQ的理由。其實我們選擇RabbitMQ的時候,有一個主要的考量目標就是:當訊息入到RabbtMQ節點上的時候,RabbitMQ的延遲以及響應。

4. 什麼是AMQP高階訊息佇列協議?

  • AMQP全稱:Advanced Message Queuing Protocol(高階訊息佇列協議)

AMQP定義:是具有現代特徵的二進位制協議。是一個提供統一訊息服務的應用層標準高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。

它就類似於Java中的JMS。是比較上層的規範,基於這個規範可以開發出各種各項的訊息中介軟體。

模型分析

Pubilsher application:生產者應用 生產的訊息,扔到Server端。

Server:指的就是RabbitMQ的節點

Virtual host:虛擬主機,比較上層的一個路由,類似於路由器這麼一個概念。後續介紹

Exchange:交換機,生產者直接將訊息投遞到Exchange中。但是要經歷3個過程 -》server->Virtual host->Exchange

先確定將訊息傳送到哪臺伺服器,那麼就需要先去建立連線,設定一些地址等等。
第二層,投遞到哪個Virtual host 需要定義。
第三層,投遞到哪個Exchange也需要定義。

再看Consumer application 消費者的應用端,消費端只需要監聽Message Queue,當佇列中有訊息的時候,就拿出來消費。因此在Exchange和Message Queue之間有繫結的關係存在,後續詳細介紹。

5. AMQP核心概念是什麼?

AMQP核心概念:

  • server: 又稱Broker,接收客戶端的連結,實現AMQP實體服務
  • Connection: 連結,應用程式與Broker的網路連線
  • Channel:網路通道,幾乎所有的操作(資料的讀、寫)都在Channel中進行,Channel是進行訊息讀寫的通道。客戶端可建立多個Channel,每個Channel代表一個會話任務。
  • Message:訊息,伺服器和應用程式之間傳送的資料,由Properties和Body組成。Properties可以對訊息進行修飾,比如訊息的優先順序、延遲等高階特性;Body則就是訊息體內容。
  • Virtual host:虛擬地址,用於進行邏輯隔離,最上層的訊息路由。一個Virtual host 裡面可以有若干個Exchange和Queue,同一個Virtual Host裡面不能有相同名稱的Exchange和Queue。一種邏輯概念,類似Redis的邏輯資料庫。用來劃分具體的服務。
  • Exchange:交換機,接收訊息,根據路由鍵轉發訊息到繫結的佇列
  • Binding:Exchange 和Queue之間的虛擬連線,Binding中可以包含routing key
  • Routing key:一個路由股則,虛擬機器可用它來確定如何路由一個特定訊息。
  • Queue:也稱為message Queue,訊息佇列,儲存訊息並將它們轉發給消費者。

以上核心概念先有一個大概的認知,以後會詳細介紹。

6. RabbitMQ整體架構模型是什麼樣子的?


生產者把訊息投遞到Exchange,Exchange投遞到Queue.
因此我們的生產者只需要關注把訊息投遞到指定的Exchange即可,我們的消費者只需要監聽指定Queue即可。就是這麼簡單的機制。
通過圖我們也能看到,生產者不需要關注投遞到哪個佇列,消費也不需要關注是從哪個Exchange上來的,這兩塊沒有耦合的情況。主要是應為Exchange和Queue有一個繫結的關係。

7. RabbitMQ訊息是如何流轉的?

生產者publisher application 生產訊息Message投遞到Exchange上,Exchange繫結MessageQueue,可以繫結過多個MessageQueue,為什麼三個佇列只有其中一個佇列收到了訊息呢?主要是由於Exchange是有一個路由功能的。這個路由就是routing key,這個路由有兩個非常關鍵的點,
第一個:你的訊息是需要傳送到哪個Exchange。
第二個:你發訊息的時候需要帶上routing key,然後通過Exchange 和 MessageQueue 建立一個繫結關係,通過路由key把訊息路由到一個指定的佇列上。然後我們的消費端直接監聽佇列就行了,就可以消費了。

文末

歡迎關注個人微信公眾號:Coder程式設計
獲取最新原創技術文章和免費學習資料,更有大量精品思維導圖、面試資料、PMP備考資料等你來領,方便你隨時隨地學習技術知識!
新建了一個qq群:315211365,歡迎大家進群交流一起學習。謝謝了!也可以介紹給身邊有需要的朋友。

文章收錄至
Github: https://github.com/CoderMerlin/coder-programming
Gitee: https://gitee.com/573059382/coder-programming
歡迎關注並star~

參考資料:

《RabbitMQ訊息中介軟體技術精講》

推薦文章:

訊息中介軟體——RabbitMQ(一)Windws/Linux環境搭建(完整版)

訊息中介軟體——RabbitMQ(二)各大主流訊息中介軟體綜合對比介紹