使用MQ消息隊列的優(yōu)缺點詳解
前言
公司的項目一直都是在使用MQ的,但是由于使用的功能很簡單,所以一直都是知其然不知其所以然,作為一個程序猿有必要了解每一個使用的技術,為什么使用它?它的優(yōu)點是什么?缺點是什么?等等。。。
使用mq的好處
解耦與復用
系統(tǒng)A要發(fā)送一個消息到多個系統(tǒng),如果此時每增加一個系統(tǒng),系統(tǒng)A都需要通過修改源碼來增加接口,此時耦合非常高,但是如果中間使用消息隊列的話,系統(tǒng)只需要發(fā)送一次到消息隊列,別的系統(tǒng)就能復用該信息,當增加或刪除系統(tǒng)調用接口的時候,不需要額外的更新代碼。
異步
用戶調用一個接口的時候,可能該接口調用了別的方法。例如:用戶注冊的時候,后臺可能需要調用:查詢數據庫,插入數據庫,發(fā)送郵件,發(fā)送用戶指南等等...
但是用戶可能并不需要后臺將所有的任務執(zhí)行完畢,那么此時在初入數據口后面加入mq隊列,用戶就能很快得到注冊成功的響應而去做一些別的事情。mq的機制又能保證最終的一致性,所以使用起來很安全很穩(wěn)定。
消峰
何為消峰,就是當系統(tǒng)壓力過大的時候,讓系統(tǒng)壓力減小。如何做?
加入數據庫的讀寫每秒3000,在高峰期,系統(tǒng)的訪問達到了每秒10000。此時由于加入了消息隊列,所以不會出現激增的訪問導致系統(tǒng)奔潰。
(注意,曉峰并不會讓用戶的等待時間減少,所以一般會跟異步搭配來使用)
使用mq的缺點
增加了復雜度與降低了可用性
本來系統(tǒng)之間直接通行調用接口就行了,但是引入了mq導致系統(tǒng)的復雜度大大增加,并且如果mq掛掉了,那么系統(tǒng)之間的通信就中斷了,導致整個系統(tǒng)的全部掛掉。
一致性問題
A系統(tǒng)處理完了發(fā)送到消息對流后直接返回成功了,用戶以為你這個請求就成功了;但是問題是,其他系統(tǒng)消費該消息后,如果當中有一個系統(tǒng)出現了問題,導致數據丟失。最后就會發(fā)生數據不一致等問題。
常見的mq的區(qū)別
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
單機吞吐量 | 萬級,吞吐量比RocketMQ和Kafka要低了一個數量級 | 萬級,吞吐量比RocketMQ和Kafka要低了一個數量級 | 10萬級,RocketMQ也是可以支撐高吞吐的一種MQ | 10萬級別,這是kafka最大的優(yōu)點,就是吞吐量高。一般配合大數據類的系統(tǒng)來進行實時數據計算、日志采集等場景 |
topic數量對吞吐量的影響 | topic可以達到幾百,幾千個的級別,吞吐量會有較小幅度的下降這是RocketMQ的一大優(yōu)勢,在同等機器下,可 | topic可以達到幾百,幾千個的級別,吞吐量會有較小幅度的下降這是RocketMQ的一大優(yōu)勢,在同等機器下,可 | ||
時效性 | ms級 | 微秒級,這是rabbitmq的一大特點,延遲是最低的 | ms級 | 延遲在ms級以內 |
可用性 | 高,基于主從架構實現高可用性 | 高,基于主從架構實現高可用性 | 非常高,分布式架構 | 非常高,kafka是分布式的,一個數據多個副本,少數機器宕機,不會丟失數據,不會導致不可用 |
消息可靠性 | 有較低的概率丟失數據 | 經過參數優(yōu)化配置,可以做到0丟失 | 經過參數優(yōu)化配置,消息可以做到0丟失 | |
功能支持 | MQ領域的功能極其完備 | 基于erlang開發(fā),所以并發(fā)能力很強,性能極其好,延時很低 | MQ功能較為完善,還是分布式的,擴展性好 | 功能較為簡單,主要支持簡單的MQ功能,在大數據領域的實時計算以及日志采集被大規(guī)模使用,是事實上的標準 |
優(yōu)劣勢總結 | 非常成熟,功能強大,在業(yè)內大量的公司以及項目中都有應用偶爾會有較低概率丟失消息而且現在社區(qū)以及國內應用都越來越少,官方社區(qū)現在對ActiveMQ 5.x維護越來越少,幾個月才發(fā)布一個版本而且確實主要是基于解耦和異步來用的,較少在大規(guī)模吞吐的場景中使用 | erlang語言開發(fā),性能極其好,延時很低;吞吐量到萬級,MQ功能比較完備而且開源提供的管理界面非常棒,用起來很好用社區(qū)相對比較活的。RabbitMQ吞吐量會低一些,這是因為他做的實現機制比較重。erlang開發(fā)很難去看懂源碼,你公司對這個東西的掌控很弱,基本職能依賴于開源社區(qū)的快速維護和修復bug。 | 接口簡單易用,而且畢竟在阿里大規(guī)模應用過,可以做到大規(guī)模吞吐,性能也非常好,分布式擴展也很方便,社區(qū)維護還可以,可靠性和可用性是ok的,還可以支撐大規(guī)模的topic數量。阿里出品都是java系的,我們可以自己閱讀源碼。 | kafka的特點其實很明顯,就是僅僅提供較少的核心功能,但是提供超高的吞吐量,ms級的延遲,極高的可用性以及可靠性,而且分布式可以任意擴展同時kafka最好是支撐較少的topic數量即可,保證其超高吞吐量而且kafka唯一的一點劣勢是有可能消息重復消 |
總結
所以在軟件的正常功能開發(fā)中,并不需要去刻意的尋找消息隊列的使用場景,而是當出現性能瓶頸時,去查看業(yè)務邏輯是否存在可以異步處理的耗時操作,如果存在的話便可以引入消息隊列來解決。否則盲目的使用消息隊列可能會增加維護和開發(fā)的成本卻無法得到可觀的性能提升,那就得不償失了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
利用Spring MVC+Mybatis實現Mysql分頁數據查詢的過程詳解
這篇文章主要給大家介紹了關于利用Spring MVC+Mybatis實現Mysql分頁數據查詢的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。2017-08-08Idea Jrebel 報錯:Cannot reactivate,offline 
本文主要介紹了Idea Jrebel 報錯:Cannot reactivate,offline seat in use,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06Java中static與instance的區(qū)別及作用詳解
這篇文章主要為大家介紹了Java中static與instance的區(qū)別及作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07使用Spring事件監(jiān)聽機制實現跨模塊調用的步驟詳解
Spring 事件監(jiān)聽機制是 Spring 框架中用于在應用程序的不同組件之間進行通信的一種機制,Spring 事件監(jiān)聽機制基于觀察者設計模式,使得應用程序的各個部分可以解耦,提高模塊化和可維護性,本文給大家介紹了使用Spring事件監(jiān)聽機制實現跨模塊調用,需要的朋友可以參考下2024-06-06SpringBoot整合Mybatis與druid實現流程詳解
這篇文章主要介紹了springboot整合mybatis plus與druid詳情,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的下伙伴可以參考一下2022-10-10【IntelliJ IDEA】Maven構建自己的第一個Java后臺的方法
本篇文章主要介紹了Maven構建自己的第一個Java后臺的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12解決Springboot整合shiro時靜態(tài)資源被攔截的問題
這篇文章主要介紹了解決Springboot整合shiro時靜態(tài)資源被攔截的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例
這篇文章主要為大家介紹了ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03