使用MQ消息隊列的優缺點


前言

公司的項目一直都是在使用MQ的,但是由於使用的功能很簡單,所以一直都是知其然不知其所以然,作為一個程序猿有必要了解每一個使用的技術,為什么使用它?它的優點是什么?缺點是什么?等等。。。

使用mq的好處

解耦與復用

系統A要發送一個消息到多個系統,如果此時每增加一個系統,系統A都需要通過修改源碼來增加接口,此時耦合非常高,但是如果中間使用消息隊列的話,系統只需要發送一次到消息隊列,別的系統就能復用該信息,當增加或刪除系統調用接口的時候,不需要額外的更新代碼。

異步

用戶調用一個接口的時候,可能該接口調用了別的方法。例如:用戶注冊的時候,后台可能需要調用:查詢數據庫,插入數據庫,發送郵件,發送用戶指南等等...

但是用戶可能並不需要后台將所有的任務執行完畢,那么此時在初入數據口后面加入mq隊列,用戶就能很快得到注冊成功的響應而去做一些別的事情。mq的機制又能保證最終的一致性,所以使用起來很安全很穩定。

消峰

何為消峰,就是當系統壓力過大的時候,讓系統壓力減小。如何做?

加入數據庫的讀寫每秒3000,在高峰期,系統的訪問達到了每秒10000。此時由於加入了消息隊列,所以不會出現激增的訪問導致系統奔潰。
(注意,曉峰並不會讓用戶的等待時間減少,所以一般會跟異步搭配來使用)

使用mq的缺點

增加了復雜度與降低了可用性

本來系統之間直接通行調用接口就行了,但是引入了mq導致系統的復雜度大大增加,並且如果mq掛掉了,那么系統之間的通信就中斷了,導致整個系統的全部掛掉。

一致性問題

A系統處理完了發送到消息對流后直接返回成功了,用戶以為你這個請求就成功了;但是問題是,其他系統消費該消息后,如果當中有一個系統出現了問題,導致數據丟失。最后就會發生數據不一致等問題。

常見的mq的區別

特性 ActiveMQ RabbitMQ RocketMQ Kafka
單機吞吐量 萬級,吞吐量比RocketMQ和Kafka要低了一個數量級 萬級,吞吐量比RocketMQ和Kafka要低了一個數量級 10萬級,RocketMQ也是可以支撐高吞吐的一種MQ 10萬級別,這是kafka最大的優點,就是吞吐量高。一般配合大數據類的系統來進行實時數據計算、日志采集等場景
topic數量對吞吐量的影響 topic可以達到幾百,幾千個的級別,吞吐量會有較小幅度的下降這是RocketMQ的一大優勢,在同等機器下,可 topic可以達到幾百,幾千個的級別,吞吐量會有較小幅度的下降這是RocketMQ的一大優勢,在同等機器下,可
時效性 ms級 微秒級,這是rabbitmq的一大特點,延遲是最低的 ms級 延遲在ms級以內
可用性 高,基於主從架構實現高可用性 高,基於主從架構實現高可用性 非常高,分布式架構 非常高,kafka是分布式的,一個數據多個副本,少數機器宕機,不會丟失數據,不會導致不可用
消息可靠性 有較低的概率丟失數據 經過參數優化配置,可以做到0丟失 經過參數優化配置,消息可以做到0丟失
功能支持 MQ領域的功能極其完備 基於erlang開發,所以並發能力很強,性能極其好,延時很低 MQ功能較為完善,還是分布式的,擴展性好 功能較為簡單,主要支持簡單的MQ功能,在大數據領域的實時計算以及日志采集被大規模使用,是事實上的標准
優劣勢總結 非常成熟,功能強大,在業內大量的公司以及項目中都有應用偶爾會有較低概率丟失消息而且現在社區以及國內應用都越來越少,官方社區現在對ActiveMQ 5.x維護越來越少,幾個月才發布一個版本而且確實主要是基於解耦和異步來用的,較少在大規模吞吐的場景中使用 erlang語言開發,性能極其好,延時很低;吞吐量到萬級,MQ功能比較完備而且開源提供的管理界面非常棒,用起來很好用社區相對比較活的。RabbitMQ吞吐量會低一些,這是因為他做的實現機制比較重。erlang開發很難去看懂源碼,你公司對這個東西的掌控很弱,基本職能依賴於開源社區的快速維護和修復bug。 接口簡單易用,而且畢竟在阿里大規模應用過,可以做到大規模吞吐,性能也非常好,分布式擴展也很方便,社區維護還可以,可靠性和可用性是ok的,還可以支撐大規模的topic數量。阿里出品都是java系的,我們可以自己閱讀源碼。 kafka的特點其實很明顯,就是僅僅提供較少的核心功能,但是提供超高的吞吐量,ms級的延遲,極高的可用性以及可靠性,而且分布式可以任意擴展同時kafka最好是支撐較少的topic數量即可,保證其超高吞吐量而且kafka唯一的一點劣勢是有可能消息重復消

總結

所以在軟件的正常功能開發中,並不需要去刻意的尋找消息隊列的使用場景,而是當出現性能瓶頸時,去查看業務邏輯是否存在可以異步處理的耗時操作,如果存在的話便可以引入消息隊列來解決。否則盲目的使用消息隊列可能會增加維護和開發的成本卻無法得到可觀的性能提升,那就得不償失了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM