我們要選擇哪個消息隊列產品?

来源:https://www.cnblogs.com/wing011203/archive/2023/03/06/17182477.html
-Advertisement-
Play Games

這篇文章主要描述如何進行消息隊列產品選型,包括產品選型需要考慮的因素、三種比較流行的消息隊列產品的優缺點以及如何根據我們的使用場景選擇合適的消息隊列產品。 ...


圖靈獎得主弗雷德里克·布魯克斯(Frederick P.Brooks Jr.)在他的經典著作《人月神話》中提出了“沒有銀彈”的觀點,在軟體工程中,每一個軟體系統,都具有獨特性,不存在像“銀彈”一樣的解決方案,可以解決一切問題。

對於消息隊列來說也是一樣的,我們常用的消息隊列技術選型,都有各自的優勢和劣勢,我們需要根據自己的應用場景,選擇合適的消息隊列解決方案。

消息隊列選擇標準

拋開不同的消息隊列在功能和特性上的區別,當我們做消息隊列技術選型時,有一些通用的標準需要考慮。

  • 消息隊列產品是開源的,這樣如果有一天使用消息隊列時遇到一個影響業務功能的Bug,我們還可以通過修改源代碼迅速修複。
  • 消息隊列產品是比較流行並且有一定活躍度的社區,這樣只要你的應用場景不是特別冷門,那麼你在使用過程中遇到的問題,基本是別人也會遇到並且已經修複的。
  • 一款合格的消息隊列產品還需要具備以下特性:
    • 消息的可靠傳遞,確保不丟消息。
    • 支持集群,確保不會因為某個節點宕機導致服務不可用。
    • 具有良好的性能,滿足絕大多數場景需求。

常見的消息隊列產品

我們主要討論三個常見的消息隊列產品:

  • RabbitMQ
  • RocketMQ
  • Kafka

RabbitMQ

RabbitMQ是一個輕量級的消息隊列,它使用Erlang語言編寫,最早是為電信行業系統之間的可靠通信設計的,官網地址:https://www.rabbitmq.com/

RabbitMQ一個有特色的功能是支持非常靈活的路由配置,它在生產者和隊列之間增加了Exchange模塊,可以根據配置的路由規則將生產者發出的消息發到不同的隊列中,路由規則可以非常靈活,甚至我們可以自己來實現路由規則。

RabbitMQ的客戶端支持很多不同的編程語言,如果我們的應用使用的編程語言比較冷門,那麼很有可能你能找到對應語言的RabbitMQ客戶端。

RabbitMQ存在3個問題:

  1. RabbitMQ對消息堆積的支持不好,它的設計理念是消息隊列是一個管道,大量的消息積壓是一種不正常的情況,應當去避免。
  2. RabbitMQ的性能是我們考察的三個消息隊列產品中最差的,它每秒可以處理幾萬到十幾萬條消息,如果我們的應用場景對消息隊列的性能要求非常高,那麼RabbitMQ就不是合適的選擇。
  3. RabbitMQ使用的變成語言是Erlang,這個編程語言不僅小眾,而且學習曲線很陡峭。

RocketMQ

RocketMQ是阿裡巴巴在2012年開源的消息隊列產品,後來捐贈給Apache軟體基金會,2017年正式畢業,稱為Apache的頂級項目。RocketMQ的官網地址:https://rocketmq.apache.org/

RocketMQ使用Java語言編寫,它有非常活躍的中文社區,你遇到的大多數問題都可以找到中文的答案。

RocketMQ對線上業務的響應時延做了大量優化,大多數情況下可以做到毫秒級響應,如果我們的應用場景中時延響應非常重要,那麼可以選擇RocketMQ。

RocketMQ的性能要比RabbitMQ高一個數量級,每秒鐘可以處理幾十萬條消息。

RocketMQ的一個劣勢是它在國外沒有那麼流行,與周邊生態系統集成和相容稍微差一些。

Kafka

Kafka最早由LinkedIn開發,目前也是Apache的頂級項目,官網地址:https://kafka.apache.org/

Kafka目前已經是一個非常成熟的消息隊列產品,無論是在數據可靠性、穩定性還是功能特性等方面都可以滿足絕大多數場景的需求。

Kafka使用Scala和Java語言開發,設計上大量使用了批量和非同步的思想,這樣可以讓Kafka做到高性能,Kafka的性能,特別是非同步收發的性能,是這三款消息隊列產品中最好的。它在性能上和RocketMQ沒有數量級上的差別,每秒鐘可以處理幾十萬條消息。

Kafka與周邊生態系統的相容性是最好的沒有之一,尤其是在大數據和流計算領域,幾乎所有的相關開源軟體都會優先選擇支持Kafka。

Kafka存在的問題是同步收發消息的響應時延比較高,當客戶端發送一條消息時,Kafka並不會立即發送出去,而是要等一會兒攢在一批再統一發送,在它的Broker中很多地方還存在“攢一波再處理”的設計,當我們的業務場景中每秒鐘的消息數量沒有那麼多時,Kafka的時延反而會比較高,因此,Kafka不太適合線上業務場景。

其他消息隊列

除了上述三款比較流行的消息隊列產品,我們還可以看一下處於“第二梯隊”的消息隊列產品,包括:

  • ActiveMQ
  • ZeroMQ

ActiveMQ

ActiveMQ是最老牌的消息隊列,目前已經進入老年期,社區不活躍,它存在的主要意義僅限於相容哪些還在用的軟體系統。

ActiveMQ的官網地址:https://activemq.apache.org/

ZeroMQ

ZeroMQ嚴格意義上講不是一個消息隊列,而是基於消息隊列的多線程網路庫,如果我們的應用場景需要將消息隊列的功能集成到系統進程中,可以考慮使用ZeroMQ。

ZeroMQ的官網地址:https://zeromq.org/

Pulsar的官網地址:https://pulsar.apache.org/

如何選擇合適的消息隊列產品?

結合上面描述的各個消息隊列產品,我們可以得出下麵的建議。

  • 如果消息隊列不是我們將要構建的系統的關鍵組件,而且我們對性能也沒有很高的要求,只是需要一個開箱即用易於維護的產品,那麼可以選擇RabbitMQ。
  • 如果我們的應用場景是處理線上業務,那麼RocketMQ的低延遲和金融級的穩定性是我們需要的。
  • 如果我們需要處理海量消息,或者我們場景中使用了大數據、流計算等開源產品,那麼Kafka是最合適的消息隊列。
    作者:李潘     出處:http://wing011203.cnblogs.com/     本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 記得在360實習的時候,聽到過一句話,大部分的安全問題並不是黑客造成的,而是內部人員。 epbf可以避免代碼侵入,像樁子一樣監控應用,同時也帶來了一些安全問題。 下麵簡單演示一下如何利用bpftrace竊取Mysql的賬號密碼。 步驟 Go程式 這個程式只是利用xorm連接資料庫,然後判斷st ...
  • 1、工作應用場景 統計得到每個小時的UV、PV、IP的個數,構建如下表結構: 但是表中數據的存儲格式不利於直接查詢展示,需要進行調整:(以時間分區,去重、聚合等……對結果進行行列轉換) 2、行轉列 (1)多行轉多列 case when函數 功能:用於實現對數據的判斷,根據條件,不同的情況返回不同的結 ...
  • 依賴的類: 1 "use strict"; 2 3 var __emptyPoint = null, __emptyPointA = null; 4 5 const ColorRefTable = { 6 "aliceblue": "#f0f8ff", 7 "antiquewhite": "#fae ...
  • 初探富文本之CRDT協同實例 在前邊初探富文本之CRDT協同演算法一文中我們探討了為什麼需要協同、分散式的最終一致性理論、偏序集與半格的概念、為什麼需要有偏序關係、如何通過數據結構避免衝突、分散式系統如何進行同步調度等等,這些屬於完成協同所需要瞭解的基礎知識,實際上當前有很多成熟的協同實現,例如aut ...
  • 功能介紹 平臺採用B/S結構,後端採用主流的Python語言進行開發,前端採用主流的Vue.js進行開發。 整個平臺包括前臺和後臺兩個部分。 前臺功能包括:首頁、圖書詳情頁、用戶中心模塊。 後臺功能包括:總覽、借閱管理、圖書管理、分類管理、標簽管理、評論管理、用戶管理、運營管理、日誌管理、系統信息模 ...
  • Canvas var canvas = document.querySelector('.myCanvas'); var width = canvas.width = window.innerWidth; var height = canvas.height = window.innerHeight ...
  • 離職在家 閑來無事看最近ChatGPT很火 花了一天時間 用Uniapp寫了一個小程式端的ChatGPT,實在是看不慣~ 一大堆利用ChatGPT收費的應用(小程式) 整個開源的玩玩 另外主要是自己本身是後端開發人員~ 剛好用uniapp實踐一下小程式開發 先看看主頁面效果圖吧 演示視頻-> 做一個 ...
  • 前言 用數據生成CAD圖,一般採用的ObjectArx對CAD二次開發完成。ObjectARX是AutoDesk公司針對AutoCAD平臺上的二次開發而推出的一個開發軟體包,它提供了以C++為基礎的面向對象的開發環境及應用程式介面,能訪問和創建AutoCAD圖形資料庫。而由於現在懂C++的人少,很多 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...