本篇文章不涉及到代碼,只是站在理論的角度上去思考,整理,更清晰的認識消息隊列。前端
其實並無標準定義。通常認爲,消息中間件屬於分佈式系統中一個子系統,關注於數據的發送和接收,利用高效可靠的異步消息傳遞機制對分佈式系統中的其他各個子系統進行集成。數據庫
固然消息隊列的應用場景還有不少,分佈式事務,延時訂單的處理等高級用法,可是最經常使用的仍是以上三種場景。編程
既然消息隊列這麼好,那咱們乾脆都用它好了;其實否則,人無完人,有優勢也有缺點,下面咱們就來總結一下他的優缺點:後端
什麼是RabbitMQ呢?鑑用百度的一句話:服務器
RabbitMQ是實現了高級消息隊列協議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件)。RabbitMQ服務器是用Erlang語言編寫的,而集羣和故障轉移是構建在開放電信平臺框架上的。全部主要的編程語言均有與代理接口通信的客戶端庫。架構
那麼AMQP又是什麼呢?爲了好理解,我就不套用百度了,簡單來講AMPQ應用層協議的一個開放標準,,它制定了一套規範的消息服務器的模型,能夠由不一樣的中間件去實現它,是爲面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不一樣產品,不一樣的開發語言等條件的限制。目標是實現一種在全行業普遍使用的標準消息中間件技術,以便下降企業和系統集成的開銷,而且向大衆提供工業級的集成服務,主要實現有RabbitMQ。併發
再用簡單的話解釋一下RabbitMQ:他是一個系統之間以解耦和異步的方式進行邏輯交互的一箇中間平臺,使用Erlang語言實現,系統之間能夠不進行強依賴,只須要保證這個中間平臺能夠成功的將消息進行傳遞便可。框架
固然,消息中間件也不僅有RabbitMQ,還有其餘的好比:RocketMQ、Kafka、ActiveMQ、還有好多。。。。。
那麼相比之下RabbitMQ的地位如何呢?看下圖:
異步
實際工做中對於各類MQ的技術選型我的認爲是這樣的:編程語言
用戶訪問量在ActiveMQ 的可承受範圍內,並且確實主要是基於解耦和異步來用的,能夠考慮ActiveMQ,也比較貼近Java
工程師的使用習慣,可是ActiveMQ 如今中止維護了,同時ActiveMQ 併發不高,因此業務量必定的狀況下能夠考慮使用。
RabbitMQ 做爲一個純正血統的消息中間件,有着高級消息協議AMQP 的完美結合,在消息中間件中地位無可取代,可是erlang
語言阻止了咱們去深刻研究和掌控,對公司而言,底層技術沒法控制,可是確實是開源的,有比較穩定的支持,活躍度也高。
對本身公司技術實力有絕對自信的,能夠用RocketMQ,可是RocketMQ誕生比較晚,而且更新迭代很快,這個意味着在使用過程當中有可能會遇到不少坑,因此若是大家公司Java 技術不是很強,不推薦使用。
中小型公司,技術實力較爲通常,技術挑戰不是特別高,用ActiveMQ、RabbitMQ是不錯的選擇;大型公司,基礎架構研發實力較強,用RocketMQ是很好的選擇
若是是大數據領域的實時計算、日誌採集等場景,用Kafka 是業內標準的,絕對沒問題,社區活躍度很高,幾乎是全世界這個領域的事實性規範。
從性能上來看,使用文件系統的消息中間件(Kafka、RokcetMq)性能是最好的,因此基於文件系統存儲的消息中間件是發展趨勢。(從存儲方式和效率來看文件系統>KV存儲>關係型數據庫)
沒有坐享其成的工做,更沒有不勞而獲的收穫,若比別人貪心,請比別人用心。