Kafka 和 RabbitMQ 有何區別?

Kafka 和 RabbitMQ 是可以在串流處理中使用的訊息佇列系統。資料串流是需要高速處理的大量連續增量資料。例如,可能是有關環境的感測器資料,您必須持續收集和處理,以觀察溫度或氣壓的即時變化。RabbitMQ 是一種分散式訊息代理程式,可收集來自多個來源的串流資料,將資料路由到不同的目的地進行處理。Apache Kafka 是一個串流平台,用於建立即時資料管道和串流應用程式。Kafka 提供一個高度可擴展、容錯且耐用的訊息傳遞系統,具有比 RabbitMQ 更多的功能。

閱讀有關串流資料的內容 »

閱讀有關 Apache Spark 的內容 »

架構差異:Kafka 與RabbitMQ

RabbitMQ 和 Apache Kafka 均允許生產者將訊息傳送給取用者。生產者是發佈資訊的應用程式,而取用者是訂閱和處理資訊的應用程式。

生產者和取用者在 RabbitMQ 和 Kafka 中以不同的方式互動。在 RabbitMQ 中,生產者傳送訊息並監控其是否到達預期的取用者處。另一方面,Kafka 生產者將訊息發佈到佇列,而不管消費者是否已擷取它們。

您可以將 RabbitMQ 視為接收郵件並將其交付給預定收件方的郵局。與此同時,Kafka 類似於圖書館,其中會按生產者發佈的不同流派組織書架上的訊息。然後,取用者閱讀各自書架上的訊息,並記住他們讀過的內容。 

RabbitMQ 架構方法

RabbitMQ 代理程式允許藉助下列元件進行低延遲和複雜的訊息分配:

  • 交換會接收來自生產者的訊息,並決定應該將其路由到何處
  • 佇列是接收來自交換的訊息並將其傳送給取用者的儲存空間
  • 繫結是連線交換和代理程式的路徑

在 RabbitMQ 中,路由金鑰是用來將訊息從交換路由智特定佇列的訊息屬性。當生產者將訊息傳送至交換時,它會包含作為訊息一部分的路由金鑰。然後,交換會使用此路由金鑰來決定訊息應該傳遞至哪個佇列。

Kafka 架構方法

Kafka 叢集以更複雜的架構提供高輸送量串流事件處理。以下是一些重要的 Kafka 元件:

  • Kafka 代理程式是 Kafka 私服器,允許生產者將資料流式傳輸給取用者。 Kafka 代理程式包含主題及其各自的分割區。 
  • 主題是將類似資料分組在 Kafka 代理程式中的資料存儲。 
  • 分割區是取用者所訂閱主題中較小規模的資料儲存。 
  • ZooKeeper 是管理 Kafka 叢集和分割區以提供容錯串流的軟體。ZooKeeper 最近被取代為 Apache Kafka Raft (KRaft) 通訊協定。

Kafka 中的生產者為每條訊息指派一個訊息密鑰。然後,Kafka 代理程式將訊息儲存在該特定主題的主導分割區中。Kraft 通訊協定使用共識演算法來確定主導的分割區。 

Kafka 和 RabbitMQ 如何以不同的方式處理簡訊?

RabbitMQ 和阿 Apache Kafka 以不同的方式將資料從生產者移動到取用者。RabbitMQ 是一種通用的訊息代理程式,可優先處理端對端訊息交付。Kafka 是分散式事件串流平台,支援持續大數據的即時交換。

RabbitMQ 和 Kafka 設計用於不同的使用案例,因此它們以不同的方式處理簡訊。 接下來,我們討論一些具體的差異。

訊息取用

在 RabbitMQ 中,代理程式可確保取用者接收訊息。取用者應用程式需要被動角色,並等待 RabbitMQ 代理程式將訊息推入佇列。例如,銀行應用程式可能會等待來自中央交易處理軟體的 SMS 提醒。

然而,Kafka 取用者更主動地讀取和追蹤資訊。隨著訊息新增至實體日誌檔案,Kafka 取用者追蹤他們讀取的最後一條訊息,並相應地更新其偏移追蹤器。偏移追蹤器是讀取訊息後遞增的計數器。使用 Kafka 時,生產者不知道取用者執行的訊息擷取。 

訊息優先順序

RabbitMQ 代理程式允許生產者軟體使用優先順序佇列升級某些訊息。代理程式會先處理較高優先順序的訊息,而不是以先進先出的順序傳送訊息。例如,零售應用程式可能會每小時將銷售交易排入佇列。不過,如果系統管理員發出優先順序備份資料庫訊息,代理程式會立即傳送。

與 RabbitMQ 不同,Apache Kafka 不支援優先順序佇列。將所有訊息分配到各自的分割區時,該代理程式將所有訊息視為等同。 

訊息排序

RabbitMQ 會以特定順序傳送訊息並將訊息排入佇列。除非優先順序較高的訊息排入系統,否則取用者會以傳送的順序接收訊息。

同時,Kafka 使用主題和分割區將訊息排入佇列。當生產者傳送訊息時,該訊息進入特定的主題和分割區。由於卡 Kafka 不支援直接生產者-取用者交換,取用者以不同的順序從分割區中提取訊息。 

訊息刪除

RabbitMQ 代理程式會將訊息路由到目的地佇列。讀取後,消費者將確認 (ACK) 回覆傳送給代理程式,代理程式則從佇列中刪除訊息。

與 RabbitMQ 不同,Apache Kafka 將訊息附加至日誌檔案中,直到其保留期到期為止。如此一來,取用者就可以在規定的期限內隨時重新處理串流資料。

其他主要差異:Kafka 與RabbitMQ

RabbitMQ 以簡單的架構提供複雜的訊息路由,而 Kafka 提供耐用的訊息代理程式系統,可讓應用程式處理串流歷史記錄中的資料。

接下來,我們分享兩個訊息代理程式之間的更多差異。 

效能

RabbitMQ 和 Kafka 都為其預期的使用案例提供高效能的訊息傳輸。但是,Kafka 在訊息傳輸容量方面優於 RabbitMQ。

Kafka 每秒可以傳送數百萬條訊息,因為它使用序列化磁碟 I/O 來啟用高輸送量的訊息交換。序列化磁碟 I/O 是一種儲存系統,用於儲存和存取相鄰記憶體空間中的資料,該系統比隨機磁碟存取更快速。

RabbitMQ 還可以每秒傳送數百萬條訊息,但它需要多個代理程式執行此動作。通常,RabbitMQ 的效能是平均每秒傳送數千條訊息,並且如果 RabbitMQ 的佇列擁塞,則可能會降低速度。 

安全性

RabbitMQ 和 Kafka 均允許應用程式安全地交換訊息,但使用不同的技術。

RabbitMQ 附帶管理使用者許可和代理程式安全性的管理工具。

與此同時,Apache Kafka 架構使用 TLS 以及 Java 身分驗證和授權服務 (JAAS) 提供安全的事件串流。TLS 是一種加密技術,可防止意外竊聽訊息;JAAS 則控制哪個應用程式可以存取代理程式系統。 

程式設計語言和通訊協定

Kafka 和 RabbitMQ 均支援開發人員熟悉的各種語言、框架和通訊協定。

可以在為 Kafka 和 RabbitMQ 建置用戶端應用程式時使用 Java 和 Ruby 編寫程式碼。此外,Kafka 支援 Python 和 Node.js,而 RabbitMQ 支援 JavaScript、Go、C、Swift、Spring、Elixir、PHP 和 .NET。

Kafka 使用 TCP 上的二進位通訊協定跨即時資料管道流式傳輸訊息,而 RabbitMQ 預設情況下支援進階訊息佇列通訊協定 (AMQP)。RabbitMQ 還支援舊式通訊協定,例如簡單文字導向簡訊通訊協定 (STOMP) 和 MQTT,以此路由訊息。

閱讀有關 MQTT 的內容 »

Kafka 和 RabbitMQ 有什麼相似之處?

應用程式需要可靠的訊息代理程式才能在雲端上交換資料。RabbitMQ 和 Kafka 都提供可擴展和容錯的平台,以滿足日益增長的流量需求和高可用性。

接下來,我們討論 RabbitMQ 和 Kafka 之間的一些關鍵相似之處。

可擴展性

RabbitMQ 可以在水平和垂直方向上擴展其訊息處理容量。您可以為 RabbitMQ 的伺服器分配更多運算資源,以提高訊息交換效率。在某些情況下,開發人員會使用稱為 RabbitMQ 一致性雜湊交換的訊息分配技術,以平衡多個代理程式之間的負載處理。

同樣,Kafka 架構允許新增更多的分割區至特定的主題,以均勻地分配訊息負載。 

容錯能力

Kafka 和 RabbitMQ 都是強大的訊息佇列架構,可以抵禦系統故障。

可以將多個 RabbitMQ 代理程式分組到叢集中,並將它們部署在不同的伺服器上。RabbitMQ 也會跨分散式節點複寫佇列訊息。這可讓系統從影響任何伺服器的故障中復原。

像 RabbitMQ 一樣,Apache Kafka 透過在不同的伺服器上託管 Kafka 叢集來共用類似的可復原性和冗餘性。每個叢集都包含日誌檔案複本,您可以在發生故障時復原這些複本。

易用性

這兩種訊息佇列系統都有強大的社群支援和程式庫,可讓您輕鬆傳送、讀取和處理訊息。這使得兩個系統的開發人員更容易開發用戶端應用程式。

例如,您可以使用 Kafka 串流 (用戶端程式庫) 在 Kafka 和 Spring 雲端資料流上建置簡訊系統,以使用 RabbitMQ 建置事件驅動的微型服務。

何時使用 Kafka 與RabbitMQ

務必了解的是,RabbitMQ 和 Kafka 不是互相競爭的訊息代理程式。兩者設計為在不同的使用案例中支援資料交換,各自具備不同的優勢。

接下來,我們討論一些可考慮使用 RabbitMQ 和 Kafka 的使用案例。

事件串流重播

Kafka 適用於需要重新分析所接收資料的應用程式。您可以在保留期間內多次處理串流資料,或收集日誌檔案進行分析。

使用 RabbitMQ 進行日誌彙總更具挑戰性,因為訊息一旦取用就會被刪除。解決方法是重播來自生產者的已儲存訊息。

即時資料處理

Kafka 以極低的延遲流式傳輸訊息,適合即時分析串流資料。例如,可以使用 Kafka 做為分散式監控服務,即時提出線上交易處理的提醒。

複雜的路由架構

RabbitMQ 為需求模糊或路由場景複雜的用戶端提供靈活性。例如,您可以設定 RabbitMQ,將資料路由到具有不同繫結和交換的不同應用程式。

有效的訊息交付

RabbitMQ 套用推送模型,這意味著生產者知道用戶端應用程式是否取用訊息。它適合在交換和分析資料時必須遵守特定序列和交付保證的應用程式。 

語言和通訊協定支援

開發人員將 RabbitMQ 用於需要向下相容於舊式通訊協定 (例如 MQTT 和 STOMP) 的用戶端應用程式。與 Kafka 相比,RabbitMQ 還支援更廣泛的程式設計語言。

Kafka 是否使用 RabbitMQ?

Kafka 不使用 RabbitMQ。這是獨立的訊息代理程式,可以在不使用 RabbitMQ 的情況下分配即時事件串流。兩者都是單獨的資料交換系統,彼此獨立運作。

但是,一些開發人員將來自 RabbitMQ 網路的訊息路由到 Kafka 中。這樣做是因為分解現有的 RabbitMQ 資料管道並使用 Kafka 重新建置它們需要付出更多的努力。 

差異摘要:Kafka 與RabbitMQ

 

RabbitMQ

Kafka

架構

RabbitMQ 的架構專為複雜的訊息路由而設計。該代理程式使用推送模型。生產者傳送訊息給使用不同規則的取用者。 

Kafka 使用基於分割區的設計進行即時、高吞吐量的串流處理。該代理程式使用提取模型。產生者會將訊息發佈至取用者訂閱的主題和分割區。 

訊息處理

RabbitMQ 代理程式監控訊息取用。該代理程式會在訊息被取用後將其刪除。它支援訊息優先順序。 

取用者使用偏移追蹤器追蹤訊息擷取。Kafka 依據保留政策保留訊息。沒有訊息優先順序。 

效能

RabbitMQ 具有低延遲。該代理程式每秒傳送數千條訊息。

Kafka 提供高達每秒數百萬條訊息的即時傳輸。

程式設計語言和通訊協定

RabbitMQ 支援廣泛的語言和舊式通訊協定。

Kafka 的程式設計語言選擇有限。該代理程式透過 TCP 使用二進位通訊協定進行資料傳輸。 

AWS 如何支援您的 RabbitMQ 和 Kafka 要求?

Amazon Web Services (AWS) 為 RabbitMQ 和 Kafka 實作提供低延遲且全受管的訊息代理程式服務:

  • 使用 Amazon MQ 佈建您的 RabbitMQ 代理程式,無需耗時的設定。Amazon MQ 會加密傳輸中和靜態中的 RabbitMQ 訊息。我們還確保跨 AWS 可用區域的高可用性資料管道。 

立即建立帳戶,開始在 AWS 上使用訊息代理程式。

與 AWS 搭配使用的後續步驟