RabbitMQ 簡介以及使用場景
一. 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萬訊息消費掉。
三. 引入訊息佇列的優缺點
1.優點
優點就是以上的那些場景應用,就是在特殊場景下有其對應的好處:解耦、非同步、削峰。
2.缺點
- 系統的可用性降低
系統引入的外部依賴越多,系統越容易掛掉,本來只是A系統呼叫BCD三個系統介面就好,ABCD四個系統不報錯整個系統會正常執行。引入了MQ之後,雖然ABCD系統沒出錯,但MQ掛了以後,整個系統也會崩潰。 - 系統的複雜性提高
引入了MQ之後,需要考慮的問題也變得多了,如何保證訊息沒有重複消費?如何保證訊息不丟失?怎麼保證訊息傳遞的順序? - 一致性問題
A系統傳送完訊息直接返回成功,但是BCD系統之中若有系統寫庫失敗,則會產生資料不一致的問題。
總結
所以總結來說,訊息佇列是一種十分複雜的架構,引入它有很多好處,但是也得針對它帶來的壞處做各種額外的技術方案和架構來規避。引入MQ系統複雜度提升了一個數量級,但是在有些場景下,就是複雜十倍百倍,還是需要使用MQ。
作者: 海向
出處:https://www.cnblogs.com/haixiang/p/10199754.html
本站使用「CC BY 4.0」創作共享協議,轉載請在文章明顯位置註明作者及出處。
相關文章
- RabbitMQ 使用場景MQ
- RabbitMQ 的應用場景以及基本原理介紹MQ
- RabbitMQ的應用場景以及基本原理介紹MQ
- RabbitMQ簡介以及與SpringBoot整合示例MQSpring Boot
- RabbitMQ 使用場景、安裝、工作模式MQ模式
- ThreadLocal概念以及使用場景thread
- RabbitMQ簡介MQ
- 7.3 應用場景簡介
- 訊息佇列的使用場景之RabbitMQ佇列MQ
- 二、RabbitMQ 進階特性及使用場景 [.NET]MQ
- Redis - 介紹與使用場景Redis
- Kafka簡介、基本原理、執行流程與使用場景Kafka
- Kubernetes簡介以及如何使用YAML配置?YAML
- 訊息匯流排Bus介紹及使用場景-訊息佇列和RabbitMQ介紹及安裝佇列MQ
- RabbitMQ簡介及安裝MQ
- 簡述訊息佇列在電商系統使用場景以及工作模式佇列模式
- Docker相關簡介以及使用方法Docker
- Hive簡介、應用場景及架構原理Hive架構
- RabbitMQ核心元件及應用場景MQ元件
- Redis多種資料型別以及使用場景Redis資料型別
- Hbase原理的介紹和使用場景分析
- 關於Ajax和websocket的區別以及使用場景!Web
- kafka入門:簡介、使用場景、設計原理、主要配置及叢集搭建(轉)Kafka
- RabbitMQ Centos7 安裝以及使用MQCentOS
- javascript中的this使用場景以及箭頭函式中的thisJavaScript函式
- 面向NLP場景應用的智慧輔助建模(一)簡介
- Jira使用簡介 HP ALM使用簡介
- 關於各種List型別特點以及使用的場景型別
- SpringCloud簡介以及相關元件SpringGCCloud元件
- docker簡介以及優缺點Docker
- LeNet簡介以及Caffe實現
- Vuex使用場景Vue
- Redis使用場景Redis
- Android Firebase接入(序)--Firebase簡介以及Firebase官方Demo的使用Android
- SpringBoot整合RabbitMQ之典型應用場景實戰二Spring BootMQ
- SpringBoot整合RabbitMQ之典型應用場景實戰一Spring BootMQ
- RocketMQ 在多 IDC 場景以及多隔離區場景下的實踐MQ
- Spring cloud(1)-簡介以及選擇SpringCloud