日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RabbitMQ:什么是消息队列MQ?为什么使用消息队列MQ?入门MQ先学哪种?(一)

發布時間:2023/12/29 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的應用。

特性ActiveMQRabbitMQRocketMQKafka
單機并發量萬級萬級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先学哪种?(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。