消息中間件——RabbitMQ(三)理解RabbitMQ核心概念和AMQP協議!

求關注

理解RabbitMQ核心概念和AMQP協議!

前言

本章學習,咱們能夠了解到如下知識點:html

  • 互聯網大廠爲何選擇RabbitMQ?
  • RabbiMQ的高性能之道是如何作到的?
  • 什麼是AMQP高級協議?
  • AMQP核心概念是什麼?
  • RabbitMQ總體架構模型是什麼樣子的?
  • RabbitMQ消息是如何流轉的?

1. 初識RabbitMQ

RabbitMQ 是一個開源的消息代理和隊列服務器,用來經過普通協議在徹底不一樣的應用之間共享數據(RabbitMQ可以實現跨語言跨平臺的機制,),RabbitMQ是使用Erlang語言來編寫的,而且RabbitMQ是基於AMQP協議的。git

僅僅經過上面一句話,相信你們必定有不少疑惑和問題。github

  • 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。是比較上層的規範,基於這個規範能夠開發出各類各項的消息中間件。

AMQP協議模型

模型分析

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總體架構模型是什麼樣子的?

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(二)各大主流消息中間件綜合對比介紹!

原文出處:https://www.cnblogs.com/coder-programming/p/11364524.html

相關文章
相關標籤/搜索