摘要:后續(xù)介紹交換機(jī),生產(chǎn)者直接將消息投遞到中。消息,服務(wù)器和應(yīng)用程序之間傳送的數(shù)據(jù),由和組成。也稱為消息隊列,保存消息并將它們轉(zhuǎn)發(fā)給消費(fèi)者。主要是應(yīng)為和有一個綁定的關(guān)系。
前言
本章學(xué)習(xí),我們可以了解到以下知識點(diǎn):
互聯(lián)網(wǎng)大廠為什么選擇RabbitMQ?
RabbiMQ的高性能之道是如何做到的?
什么是AMQP高級協(xié)議?
AMQP核心概念是什么?
RabbitMQ整體架構(gòu)模型是什么樣子的?
RabbitMQ消息是如何流轉(zhuǎn)的?
1. 初識RabbitMQRabbitMQ 是一個開源的消息代理和隊列服務(wù)器,用來通過普通協(xié)議在完全不同的應(yīng)用之間共享數(shù)據(jù)(RabbitMQ能夠?qū)崿F(xiàn)跨語言跨平臺的機(jī)制,),RabbitMQ是使用Erlang語言來編寫的,并且RabbitMQ是基于AMQP協(xié)議的。
僅僅通過上面一句話,相信大家一定有很多疑惑和問題。
RabbitM成熟度到底怎么樣?
業(yè)界使用度怎么樣?哪些大廠在使用?為什么?
包括RabbitMQ到底都有哪些特點(diǎn)?
RabbitMQ為什么要用Erlang語言去編寫?
什么是AMQP協(xié)議?AMQP協(xié)議里面的具體的規(guī)范又是什么?
我相信大家跟我一樣都會有這樣的疑惑。那么我們一起來學(xué)習(xí)一RabbitMQ吧。
我們來了解第一個問題。
2. 互聯(lián)網(wǎng)大廠為什么選擇RabbitMQ?業(yè)界使用度怎么樣?哪些大廠在使用?為什么?都有哪些優(yōu)點(diǎn)?
據(jù)我了解:滴滴、美團(tuán)、去哪兒、頭條...
這些互聯(lián)網(wǎng)大廠都會采用RabbitMQ作為它底層的消息通信的一個基礎(chǔ)組件。根本原因:
開源、性能優(yōu)秀、穩(wěn)定性保障
提供可靠性消息投遞模式(confirm)、返回模式(return)
與SpringAMQP完美的整合、擴(kuò)展性變得更強(qiáng)、API豐富
集群模式豐富、表達(dá)式配置、HA(高可用)模式、鏡像隊列模型
保證數(shù)據(jù)不丟失的前提下做到高可靠性、可用性
3. RabbiMQ的高性能之道是如何做到的?原因就在于它使用了Erlang語言,Erlang語言最初在于交換機(jī)領(lǐng)域的架構(gòu)模式,這樣使得RabbitQ在Broker之間進(jìn)行數(shù)據(jù)交互的性能是非常優(yōu)秀的。
還有一點(diǎn)也是取決于作者,RabbitMQ開發(fā)的作者在開發(fā)RabbitMQ之間,先用Erlang語言做了一個簡單的交換機(jī),然后他驚奇的發(fā)現(xiàn):Erlang的優(yōu)點(diǎn):Erlang有著和原生Socket一樣好的延遲效果。
相信大家接觸過Socket的朋友,對它的有怎樣的性能有一定的了解。像我們耳熟能詳?shù)腞PC通信框架。比如說:dubbo,它底層就是采用了Netty,Netty無非就是網(wǎng)絡(luò)編程中的高性能之王,它無非就是一個Socket。
基于這個特點(diǎn)呢,我們就有了一個充分的選擇RabbitMQ的理由。其實我們選擇RabbitMQ的時候,有一個主要的考量目標(biāo)就是:當(dāng)消息入到RabbtMQ節(jié)點(diǎn)上的時候,RabbitMQ的延遲以及響應(yīng)。
AMQP全稱:Advanced Message Queuing Protocol(高級消息隊列協(xié)議)
AMQP定義:是具有現(xiàn)代特征的二進(jìn)制協(xié)議。是一個提供統(tǒng)一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級消息隊列協(xié)議,是應(yīng)用層協(xié)議的一個開放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計。
它就類似于Java中的JMS。是比較上層的規(guī)范,基于這個規(guī)范可以開發(fā)出各種各項的消息中間件。
模型分析
Pubilsher application:生產(chǎn)者應(yīng)用 生產(chǎn)的消息,扔到Server端。
Server:指的就是RabbitMQ的節(jié)點(diǎn)
Virtual host:虛擬主機(jī),比較上層的一個路由,類似于路由器這么一個概念。后續(xù)介紹
Exchange:交換機(jī),生產(chǎn)者直接將消息投遞到Exchange中。但是要經(jīng)歷3個過程 -》server->Virtual host->Exchange
先確定將消息發(fā)送到哪臺服務(wù)器,那么就需要先去建立連接,設(shè)置一些地址等等。
第二層,投遞到哪個Virtual host 需要定義。
第三層,投遞到哪個Exchange也需要定義。
再看Consumer application 消費(fèi)者的應(yīng)用端,消費(fèi)端只需要監(jiān)聽Message Queue,當(dāng)隊列中有消息的時候,就拿出來消費(fèi)。因此在Exchange和Message Queue之間有綁定的關(guān)系存在,后續(xù)詳細(xì)介紹。
5. AMQP核心概念是什么?AMQP核心概念:
server: 又稱Broker,接收客戶端的鏈接,實現(xiàn)AMQP實體服務(wù)
Connection: 鏈接,應(yīng)用程序與Broker的網(wǎng)絡(luò)連接
Channel:網(wǎng)絡(luò)信道,幾乎所有的操作(數(shù)據(jù)的讀、寫)都在Channel中進(jìn)行,Channel是進(jìn)行消息讀寫的通道??蛻舳丝山⒍鄠€Channel,每個Channel代表一個會話任務(wù)。
Message:消息,服務(wù)器和應(yīng)用程序之間傳送的數(shù)據(jù),由Properties和Body組成。Properties可以對消息進(jìn)行修飾,比如消息的優(yōu)先級、延遲等高級特性;Body則就是消息體內(nèi)容。
Virtual host:虛擬地址,用于進(jìn)行邏輯隔離,最上層的消息路由。一個Virtual host 里面可以有若干個Exchange和Queue,同一個Virtual Host里面不能有相同名稱的Exchange和Queue。一種邏輯概念,類似Redis的邏輯數(shù)據(jù)庫。用來劃分具體的服務(wù)。
Exchange:交換機(jī),接收消息,根據(jù)路由鍵轉(zhuǎn)發(fā)消息到綁定的隊列
Binding:Exchange 和Queue之間的虛擬連接,Binding中可以包含routing key
Routing key:一個路由股則,虛擬機(jī)可用它來確定如何路由一個特定消息。
Queue:也稱為message Queue,消息隊列,保存消息并將它們轉(zhuǎn)發(fā)給消費(fèi)者。
以上核心概念先有一個大概的認(rèn)知,以后會詳細(xì)介紹。
6. RabbitMQ整體架構(gòu)模型是什么樣子的?
生產(chǎn)者把消息投遞到Exchange,Exchange投遞到Queue.
因此我們的生產(chǎn)者只需要關(guān)注把消息投遞到指定的Exchange即可,我們的消費(fèi)者只需要監(jiān)聽指定Queue即可。就是這么簡單的機(jī)制。
通過圖我們也能看到,生產(chǎn)者不需要關(guān)注投遞到哪個隊列,消費(fèi)也不需要關(guān)注是從哪個Exchange上來的,這兩塊沒有耦合的情況。主要是應(yīng)為Exchange和Queue有一個綁定的關(guān)系。
生產(chǎn)者publisher application 生產(chǎn)消息Message投遞到Exchange上,Exchange綁定MessageQueue,可以綁定過多個MessageQueue,為什么三個隊列只有其中一個隊列收到了消息呢?主要是由于Exchange是有一個路由功能的。這個路由就是routing key,這個路由有兩個非常關(guān)鍵的點(diǎn),
第一個:你的消息是需要發(fā)送到哪個Exchange。
第二個:你發(fā)消息的時候需要帶上routing key,然后通過Exchange 和 MessageQueue 建立一個綁定關(guān)系,通過路由key把消息路由到一個指定的隊列上。然后我們的消費(fèi)端直接監(jiān)聽隊列就行了,就可以消費(fèi)了。
歡迎關(guān)注個人微信公眾號:Coder編程
獲取最新原創(chuàng)技術(shù)文章和免費(fèi)學(xué)習(xí)資料,更有大量精品思維導(dǎo)圖、面試資料、PMP備考資料等你來領(lǐng),方便你隨時隨地學(xué)習(xí)技術(shù)知識!
新建了一個qq群:315211365,歡迎大家進(jìn)群交流一起學(xué)習(xí)。謝謝了!也可以介紹給身邊有需要的朋友。文章收錄至
Github: https://github.com/CoderMerli...
Gitee: https://gitee.com/573059382/c...
歡迎關(guān)注并star~
參考資料:
《RabbitMQ消息中間件技術(shù)精講》
推薦文章:
消息中間件——RabbitMQ(一)Windws/Linux環(huán)境搭建(完整版)
消息中間件——RabbitMQ(二)各大主流消息中間件綜合對比介紹!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76207.html
摘要:慕課網(wǎng)消息中間件極速入門與實戰(zhàn)學(xué)習(xí)總結(jié)時間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。 慕課網(wǎng)《RabbitMQ消息中間件極速入門與實戰(zhàn)》學(xué)習(xí)總結(jié) 時間:2018年09月05日星期三 說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:無 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:RabbitM...
摘要:它還為具有偵聽器容器的消息驅(qū)動的提供支持。接收消息當(dāng)存在基礎(chǔ)結(jié)構(gòu)時,可以使用任何來注釋以創(chuàng)建偵聽器端點(diǎn)。默認(rèn)情況下,如果禁用重試并且偵聽器拋出異常,則會無限期地重試傳遞。 Spring-amqp-tutorial Spring AMQP項目將核心Spring概念應(yīng)用于基于AMQP的消息傳遞解決方案的開發(fā)。它提供了一個模板作為發(fā)送和接收消息的高級抽象。它還為具有偵聽器容器的消息驅(qū)動的PO...
摘要:通過以上分析我們可以得出消息隊列具有很好的削峰作用的功能即通過異步處理,將短時間高并發(fā)產(chǎn)生的事務(wù)消息存儲在消息隊列中,從而削平高峰期的并發(fā)事務(wù)。 該文已加入開源項目:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項目,Star 數(shù)接近 16k)。地址:https://github.com/Snailclimb... 本文內(nèi)容思維導(dǎo)圖:showImg(ht...
摘要:可設(shè)置為模式,所有發(fā)送的消息都會被確認(rèn)一次,用戶可以自行根據(jù)發(fā)回的確認(rèn)消息查看狀態(tài)。指定路由規(guī)則生產(chǎn)者消費(fèi)者同上。傳輸層主要傳輸二進(jìn)制數(shù)據(jù)流,提供幀的處理信道復(fù)用錯誤檢測和數(shù)據(jù)表示。 showImg(http://i.niupic.com/images/2016/04/28/h7FUPX.png); 由于之前做的項目中需要在多個節(jié)點(diǎn)之間可靠地通信,所以廢棄了之前使用的Redis pub...
摘要:可設(shè)置為模式,所有發(fā)送的消息都會被確認(rèn)一次,用戶可以自行根據(jù)發(fā)回的確認(rèn)消息查看狀態(tài)。指定路由規(guī)則生產(chǎn)者消費(fèi)者同上。傳輸層主要傳輸二進(jìn)制數(shù)據(jù)流,提供幀的處理信道復(fù)用錯誤檢測和數(shù)據(jù)表示。 showImg(http://i.niupic.com/images/2016/04/28/h7FUPX.png); 由于之前做的項目中需要在多個節(jié)點(diǎn)之間可靠地通信,所以廢棄了之前使用的Redis pub...
閱讀 3275·2021-10-14 09:42
閱讀 3592·2019-08-26 13:56
閱讀 3560·2019-08-26 11:59
閱讀 973·2019-08-23 18:00
閱讀 2242·2019-08-23 17:51
閱讀 3563·2019-08-23 17:17
閱讀 1504·2019-08-23 15:11
閱讀 5340·2019-08-23 15:05