RabbitMQ:什么是消息队列MQ?为什么使用消息队列MQ?入门MQ先学哪种?(一)
0. 引言
MQ(Message Queue):消息隊列,如今在各類業務場景中已經被廣泛使用,特別在并發量日益增漲的業務和微服務架構中,消息隊列能夠幫助我們解決很多傳統方式所不能解決的問題。
所以今天,我們就開始學習消息隊列啦
1. 什么是消息隊列?
學習之前,我們要先了解什么是消息隊列,學習過java的同學應該知道,有一種數據結構叫隊列(Queue),隊列保持著先進先出的原則。消息隊列呢實際上就是一種隊列結構,這個隊列中盛裝的就是我們的消息。
什么是消息呢?通俗一點就是我們要傳遞的數據,可以是一個字符串,也可以是一個自定義的對象。
當然既然消息隊列是用來傳遞數據的,那么隊列就會有兩端:一端生產消息,我們稱之為生產者,一端接收消息并且利用該消息進行后續的處理,我們稱之為消費者。先放入到消息隊列中的消息,就會先被消費掉。如下圖所示
2. 為什么要使用消息隊列?
在講述這個問題之前,我們先引入幾個場景:
-
1、異步調用
場景一:我們有一個服務A,服務A需要調用服務B,C,三個服務的執行時間分別是1s,2s,3s。那么用戶調用服務A時,需要等待6s后才會得到執行完畢的反饋。想象一下你是這個用戶,做一個操作讓你等待6s,你會怎么想?如果你還挺有耐心的,6s能接受,那如果執行時間是1s,2min,3min,你需要等待5分1s才能得到這個回執,你還愿意等嗎?5分鐘,面都泡好了!
所以我們引入了一個服務異步調用的機制,什么是異步呢?就是服務A調用服務B,C時,不用再等待B,C執行完畢后才返回回執,服務A執行完,將服務B,C所需要的數據發送給他們,然后不等待完成,只要服務A自己的邏輯執行完成后就返回結果,這樣的執行方式,我們稱之為異步調用。
那么這個異步調用怎么實現呢?如何保證異步調用的數據一定能夠被B,C接收到呢?要知道因為服務A不會監控B,C的執行結果,所以一旦數據丟失了,那么服務A并不知道B,C都沒收到數據,也沒執行,也不問題大了嘛。
解決辦法就是MQ啦~
我們把服務B,C所需要的數據傳送到對應的消息隊列中,然后讓服務B,C分別監控他們自己的隊列,當有消息進來時,就會觸發服務B,C的消息消費邏輯,而進行下一步的業務處理,那么MQ又是如何保證消息不丟失呢?這個我們就后續再來詳解,今天我們先掌握MQ的基礎概念。
-
2、流量削峰
場景2:另一個場景就是高并發的場景,想象下我們某一個時段有海量的請求發送過來,如果請求直接打到服務上,就會導致服務承受不住而宕機。
有同學會想啦,那我不能用分布式的概念,來擴展幾個服務不就好了嘛。但是問題在于這樣的海量請求只是短時間的,更多時間的平常運行中是不會有這么多請求的,那么如果我們為了滿足這個短時間的需求,而增加服務器配置的話,是不是有點得不償失呢?
于是乎,我們引入了MQ,將這些海量的請求數據先放到MQ中,然后服務一點一點的消費,每次消費服務能夠承受的數量,這樣就能將巨大的流量削減為一小部分。這樣的操作我們也成為流量削峰。
-
3、服務解耦
場景3:與場景1類似,我們有服務A,會調用服務B,C。如果服務B,C出現報錯,就會導致服務A也報錯,而B,C的業務邏輯與服務A關系不大,比如下訂單后,要增加用戶的積分,這個增加用戶積分的操作并沒有那么重要,甚至可以晚一點執行都可以,如果因為積分服務而導致訂單服務報錯,有點不劃算
于是我們想象,如果能夠把對服務B,C的調用剝離出去,其調用不影響服務A的執行,也樣的操作稱為服務解耦,那我們的問題就解決啦。于是又是MQ來幫忙
道理類似,我們把服務B,C需要的數據,傳遞到消息隊列中,服務A執行完就直接反饋,而B,C的調用通過監控消息隊列的數據來實現。
3. 初學者優先學習哪種MQ?
當前市面上常用的MQ有:ActiveMQ,RabbitMQ,RocketMQ,Kafka這四種
mq的概念和原理是相差不大的,只是不同的mq在不同的業務場景中有不同的表現,比如RabbitMQ適用于低延遲的場景,RocketMQ適用于高并發場景,并且是唯一支持分布式事務的消息隊列,Kafka更是為了大數據而生的消息隊列,是吞吐量最大的消息隊列。
所以針對mq的學習,更多的是看大家公司的業務場景,以及自己未來可能接觸的更多的業務場景。如果對于高并發沒有那么大的要求,個人建議大家可以從RabbitMQ入手,也就是我們后續要帶大家快速上手的MQ.
而ActiveMQ的話,是Apache公司早些時候的產品,在其又推出ActiveMQ之后,社區的維護就更少了,RabbitMQ有著輕量,入門快的特點,如果MQ不是公司的重點業務支撐中間的話,那么RabbitMQ毫無疑問,是我們入門的最佳選擇。
但如果大家公司對于并發場景有要求,且對MQ的使用較頻繁,那么由alibaba開源的RocketMQ,是不錯的選擇,其支撐住了中國的雙11挑戰,足以證明它的實力,現在RocketMQ已經貢獻給Apache開源基金會了,由Apache來維護,但近期其開源社區并不活躍,所以如果選用RocketMQ還需要考慮公司是否有足夠的技術實力來支持RocketMQ
如果你學習的方向是大數據方向,那么不用懷疑,Kafka就是你的命中注定!Kafka也常用于實時的數據收集和日志采集的場景,比如ELK+Kafka的應用。
| 單機并發量 | 萬級 | 萬級 | 10萬級 | 10萬級 |
| 延遲 | 毫秒級 | 微秒級 | 毫秒級 | 毫秒級 |
| 可用性 | 高,主從架構 | 高,主從架構 | 非常高,分布式架構 | 非常高,分布式架構 |
| 消息可靠性 | 低概率丟失消息 | 基本不丟失 | 優化后可做到0丟失 | 優化后可做到0丟失 |
| 應用場景 | MQ基礎應用場景 | 低延遲業務場景 | 高吞吐業務場景 | 高吞吐,大數據領域,數據、日志采集 |
好了,本期的分享也就到此結束了,后續我們以更常用的RabbitMQ來入門,帶大家學習MQ!
關注專欄,了解更多動態
參考文章
https://github.com/doocs/advanced-java/blob/main/docs/high-concurrency/why-mq.md
總結
以上是生活随笔為你收集整理的RabbitMQ:什么是消息队列MQ?为什么使用消息队列MQ?入门MQ先学哪种?(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 截图即OCR识别文字天若开源使用
- 下一篇: 图解Transformer+DSSM