RabbitMQ——什麼情況下應用RabbitMQ?

2020-12-05 咔咔侃技術

一. RabbitMQ 簡介#

MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程式對應用程式的通信方法。應用程式通過讀寫出入隊列的消息(針對應用程式的數據)來通信,而無需專用連接來連結它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程式通過 隊列來通信。隊列的使用除去了接收和發送應用程式同時執行的要求。

RabbitMQ是使用Erlang語言開發的開源消息隊列系統,基於AMQP協議來實現。AMQP的主要特徵是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、 安全。AMQP協議更多用在企業系統內,對數據一致性、穩定性和可靠性要求很高的場景,對性能和吞吐量的要求還在其次。

二. RabbitMQ 使用場景#

### 1. 解耦(為面向服務的架構(SOA)提供基本的最終一致性實現)

場景說明:用戶下單後,訂單系統需要通知庫存系統。傳統的做法是,訂單系統調用庫存系統的接口。

傳統模式的缺點:

假如庫存系統無法訪問,則訂單減庫存將失敗,從而導致訂單失敗訂單系統與庫存系統耦合引入消息隊列

訂單系統:用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功庫存系統:訂閱下單的消息,採用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操作假如:在下單時庫存系統不能正常使用。也不影響正常下單,因為下單後,訂單系統寫入消息隊列就不再關心其他的後續操作了。實現訂單系統與庫存系統的應用解耦為了保證庫存肯定有,可以將隊列大小設置成庫存數量,或者採用其他方式解決。基於消息的模型,關心的是「通知」,而非「處理」。

簡訊、郵件通知、緩存刷新等操作使用消息隊列進行通知。

消息隊列和RPC的區別與比較:

RPC: 異步調用,及時獲得調用結果,具有強一致性結果,關心業務調用處理結果。

消息隊列:兩次異步RPC調用,將調用內容在隊列中進行轉儲,並選擇合適的時機進行投遞(錯峰流控)

2. 異步提升效率#

場景說明:用戶註冊後,需要發註冊郵件和註冊簡訊。傳統的做法有兩種 1.串行的方式;2.並行方式

(1)串行方式:將註冊信息寫入資料庫成功後,發送註冊郵件,再發送註冊簡訊。以上三個任務全部完成後,返回給客戶端

(2)並行方式:將註冊信息寫入資料庫成功後,發送註冊郵件的同時,發送註冊簡訊。以上三個任務完成後,返回給客戶端。與串行的差別是,並行的方式可以提高處理的時間

(3)引入消息隊列,將不是必須的業務邏輯,異步處理。改造後的架構如下:

3. 流量削峰#

流量削鋒也是消息隊列中的常用場景,一般在秒殺或團搶活動中使用廣泛

應用場景:系統其他時間A系統每秒請求量就100個,系統可以穩定運行。系統每天晚間八點有秒殺活動,每秒並發請求量增至1萬條,但是系統最大的處理能力只能每秒處理1000個請求,於是系統崩潰,伺服器宕機。

之前架構:大量用戶(100萬用戶)通過瀏覽器在晚上八點高峰期同時參與秒殺活動。大量的請求湧入我們的系統中,高峰期達到每秒鐘5000個請求,大量的請求打到MySQL上,每秒鐘預計執行3000條SQL。但是一般的MySQL每秒鐘扛住2000個請求就不錯了,如果達到3000個請求的話可能MySQL直接就癱瘓了,從而系統無法被使用。但是高峰期過了之後,就成了低峰期,可能也就1萬用戶訪問系統,每秒的請求數量也就50個左右,整個系統幾乎沒有任何壓力。

引入MQ:100萬用戶在高峰期的時候,每秒請求有5000個請求左右,將這5000請求寫入MQ裡面,系統A每秒最多只能處理2000請求,因為MySQL每秒只能處理2000個請求。系統A從MQ中慢慢拉取請求,每秒就拉取2000個請求,不要超過自己每秒能處理的請求數量即可。MQ,每秒5000個請求進來,結果只有2000個請求出去,所以在秒殺期間(將近一小時)可能會有幾十萬或者幾百萬的請求積壓在MQ中。這個短暫的高峰期積壓是沒問題的,因為高峰期過了之後,每秒就只有50個請求進入MQ了,但是系統還是按照每秒2000個請求的速度在處理,所以說,只要高峰期一過,系統就會快速將積壓的消息消費掉。我們在此計算一下,每秒在MQ積壓3000條消息,1分鐘會積壓18萬,1小時積壓1000萬條消息,高峰期過後,1個多小時就可以將積壓的1000萬消息消費掉。

## 三. 引入消息隊列的優缺點

優點#

優點就是以上的那些場景應用,就是在特殊場景下有其對應的好處,解耦異步削峰

缺點#

系統的可用性降低系統引入的外部依賴越多,系統越容易掛掉,本來只是A系統調用BCD三個系統接口就好,ABCD四個系統不報錯整個系統會正常運行。引入了MQ之後,雖然ABCD系統沒出錯,但MQ掛了以後,整個系統也會崩潰。系統的複雜性提高引入了MQ之後,需要考慮的問題也變得多了,如何保證消息沒有重複消費?如何保證消息不丟失?怎麼保證消息傳遞的順序?一致性問題A系統發送完消息直接返回成功,但是BCD系統之中若有系統寫庫失敗,則會產生數據不一致的問題。總結#

所以總結來說,消息隊列是一種十分複雜的架構,引入它有很多好處,但是也得針對它帶來的壞處做各種額外的技術方案和架構來規避。引入MQ系統複雜度提升了一個數量級,但是在有些場景下,就是複雜十倍百倍,還是需要使用MQ。

作者: 海向出處:https://www.cnblogs.com/haixiang/p/10199754.html本站使用「CC BY 4.0」創作共享協議,轉載請在文章明顯位置註明作者及出處。

相關焦點

  • RabbitMQ的企業級應用
    getConnection();//創建通道Channel channel=connection.createChannel();//聲明隊列,如果隊列存在什麼都不做,否則創建隊列 //參數1:隊列的名稱
  • rabbitMQ系列高級整合應用rabbitTemplate
    本文是《rabbitMq精講系列》教程中的:rabbitMQ精講系列第二十篇高級整合應用第三篇 rabbitTemplate對象。系列教程,建議從第一篇看起。
  • Linux-Centos下之RabbitMQ快速安裝
  • pvc在什麼情況下有毒 pvc是什麼材料
    在於一些平常物品使用方面,大家往往只會去在意物品的情況是怎樣,單在於物品的一些材料問題上,很多時候就會被大家忽略掉,但其實這麼去做,也屬於變相的一種影響,材料對於物品就相當於基礎,如若是基礎都沒進行好調查,後面的操作更沒法去說,那麼pvc在什麼情況下有毒?pvc是什麼材料?
  • 在什麼情況下喊叫是錯誤的
    有時候是,睡覺了,但究竟在什麼情況下會對孩子的發育造成傷害了,這不是喊叫本身的問題,聲音大,並不會傷害到孩子,然而,嚇人的聲調和危險的信息卻足以讓孩子意識到你已經失去了冷靜和自我控制能力。懂得情感引導的父母是不會這樣做的,父母不是完人,當我們承受壓力的時候很容易對我們所愛的人大喊大叫,但是別忘了孩子們會效仿我們的行為。
  • 肝癌的介入治療有什麼特點?什麼情況下介入好?醫生告訴你
    肝癌的介入治療有什麼特點?在什麼情況下介入比較好?此文醫生告訴你答案,患者不要輕易放棄,並非只有手術一種方法。01肝癌的介入治療有什麼特點?肝癌的介入治療有血管性和非血管性介入,經動脈導管栓塞化療術是臨床應用比較廣泛的一種血管性介入治療方法,消融和藥物灌注是非血管性的。
  • 什麼情況下的智齒需要拔除?
    智齒到底什麼時間段拔除才對?什麼情況下才要拔除智齒? 出現哪些跡象,就需要考慮拔智齒了?這種情況下,必要時需要切開引流的:在下頜下緣兩公分左右水平,劃開一個不大不小的口子,把肌肉從骨面剝開,分離腔隙,等待膿血肆意流淌…… 2、沒有咬合關係的
  • 什麼是強制上岸,什麼情況下可以強制上岸?
    有一個名詞叫做強制上岸,強制上岸這個詞相信很多朋友並不陌生,但是什麼叫做強制上岸?在什麼情況下可以強制上岸?相信不是很多人都不明白,今天咱們就來具體的聊一聊強制上岸的話題。強制上岸是指所有的網貸平臺暫停還款,真正面對各種催收做好了,催收報通訊錄的準備,什麼上門、上徵信等等,都已無所謂了,就是為了贏得足夠的時間和精力,不再為這些事而困擾,去浪費時間,拿出時間來好好學習,好好工作,達到自己的收支平衡。當做到收入大於支出的時候,才去真正地考慮如何去還款,只有這樣才能真正地改變自己的困境,才能走出以貸養貸的深淵。
  • 你在什麼情況下能聽到防空警報?有了新答案
    原標題:你在什麼情況下能聽到防空警報?這次有了新答案   你在什麼情況下能聽到防空警報?當城市遭受空襲時,警報聲可以提醒群眾疏散;9月18日的防空警報,提示市民銘記歷史、緬懷先烈、珍愛和平……和平年代,防空警報作為一種象徵、一種緬懷,是否能夠應用於抗災救災等突發事故情況下的災情預報與緊急報知?
  • 客廳什麼情況下才需要擺屏風?
    那麼今天我想跟大家聊一下什麼情況下客廳要擺屏風的問題?很多人都知道擺屏風能起阻隔的作用。所以經常有一些人不管自己的客廳是怎麼樣,需不需要擺屏風,你弄一個屏風回來擺一下,那客廳都要擺屏風嗎?所以通過這個例子裡面,我想告訴大家的是客廳什麼情況下要擺屏風,也要看客廳的實際情況。第一個要看客廳夠不夠大,需不需要擺屏風?如果客廳太大可以考慮一下。
  • 公轉私,什麼情況下被允許?
    有,接下來,我們就一起來說下什麼情況下公轉私被允許。第一種情況,個人獨資企業,帳戶內扣除稅費後利潤可以公轉私。舉個例子,A是一家個人獨資企業的負責人,固定時間內會將扣除費用,以及納完經營所得個稅後的利潤通過對公帳戶打給自己。這種公轉私是被允許的,可以公轉私。
  • 空壓機油在什麼情況下需要更換?
    小夥伴們,我們又見面了,前幾期我們講到了空壓機油的幾大誤區,今天我們來了解一下空壓機油在什麼情況下就需要更換新油?空壓機油過早換油會浪費,過遲的話又會給空壓機帶來負擔,造成磨損,影響空壓機的使用壽命,那我們在什麼情況下需要換油呢?
  • 什麼情況下需要做下頜角截骨手術?
    他認為A型肉毒素的應用是治療雙側咬肌肥大的一種革命性新方法。作為一種肌肉注射藥,A型肉毒素沒有顯著的副作用,比傳統的手術方法具有更多優點。Smyth建議將這一技術作為「嚼肌肥大」的常規治療方法。A型肉毒素治療咬肌肥大是近年來西方部分學者針對咬肌病理性肥大所報導的新方法,由於病理數極少,在臨床應用中,應用該嚴格掌握適應症,從發表的病例照片來看,A型肉毒素治療後臉型的高邊多為面部肌肉組織「消瘦」的變化,更不會改變下頜角區域側面的輪廓線條,與將「方臉型」塑造為「瓜子臉」的現代東方你才醒美容整形外科的原則仍有相當的差距。
  • 聲光報警器在什麼情況下會報警
    打開APP 聲光報警器在什麼情況下會報警 發表於 2019-09-06 09:12:04   聲光報警器報警原理   聲光警報器是一種安裝在現場的聲光報警設備
  • 不同情況下成人體外膜肺氧合臨床應用專家共識(2020版)發布
    近期,中國心胸血管麻醉學會牽頭組織多學科專家,制定了不同情況下成人體外膜肺氧合臨床應用專家共識。體外膜肺氧合(ECMO)是一種重要的體外生命支持技術,臨床上主要用於心臟功能不全和(或)肺功能不全的支持。ECMO由氧合器和動力泵兩部分組成,氧合器(人工肺)的功能是將非氧合血氧合成氧合血,動力泵(人工心臟)作用是形成動力驅使血液向管道的一方流動。
  • 問:什麼情況下能讓鋼軌變「麵條」?
    問:什麼情況下能讓鋼軌變「麵條」? :火車見過?
  • 腰椎手術在什麼情況下需要打釘子?
    那許多患者就有疑問了,腰椎手術在什麼情況下需要打釘子?有沒有必要呢?空軍軍醫大學唐都醫院骨科廖博主任為大家做以下講解。以腰椎間盤突出症為例,手術治療是適用於部分病情嚴重的患者和保守治療不能取得效果的患者,臨床上大約只有不到10%的患者需要手術。而在約10%的手術患者中又只有部分患者才需要「打釘子」。
  • 什麼情況下零線是有電的?
    關於正常情況下零線是否有電,很多人都會對此有所爭論。關於有電沒電,其實是人們對帶電的概念混淆,只是從個人觀點認為其有電或者沒電。認為零線沒電的人覺得,零線正常情況下不會電人,所以是沒電的;認為零線有電的是因為正常的電路中,各個地方都是有電的,如果沒電也是零電位點那地方沒電。