Kafka 與 Redis 之間有何差異?
Redis 是一個記憶體鍵值資料存放區,而 Apache Kafka 則是一個串流處理引擎。不過,您可以比較這兩種技術,因為您可以同時使用兩者來建立發佈 – 訂閱 (pub/sub) 訊息簡訊系統。在現代的雲端架構中,應用程式會分離成許多較小的獨立建置區塊,這些區塊稱為服務。發佈/訂閱簡訊為這些分散式系統提供即時事件通知。Kafka 支援提取式系統,系統中發布者和訂閱者共用一個通用的訊息佇列,訂閱者視需要從中提取訊息。Redis 支援推送式系統,系統中發布者會在事件發生時,將訊息分發給所有訂閱者。
運作方式:Kafka 與Redis 發佈/訂閱
Apache Kafka 是事件串流平台,可讓多個應用程式彼此獨立地串流資料。這些應用程式 (稱為生產者和取用者) 會在特定資料分割區 (稱為主題) 中發佈和訂閱資訊。
與此同時,Redis 設計為支援應用程式之間低延遲資料傳輸的記憶體資料庫。Redis 將所有訊息儲存在 RAM 而非硬碟上,以減少資料讀取和寫入時間。類似於 Kafka,多個取用者可以訂閱 Redis 串流以擷取訊息。
儘管可以將兩者用於發阿布/訂閱簡訊,但 Kafka 和 Redis 的運作方式有所不同。
Kafka 工作流程
Apache Kafka 透過運算叢集連線生產者和取用者。每個叢集由駐留在不同伺服器上的多個 Kafka 代理程式組成。
Kafka 出於這些目的建立主題和分割區:
- 主題用於將屬於感興趣主旨的類似資料分組,例如電子郵件、付款、使用者和購買
- 分割區用於跨不同代理程式進行資料複製和容錯
生產者將訊息發佈給代理程式。代理程式收到訊息之後,它將資料分類到具體的主題,並將資料儲存在一個分割區中。取用者連線到相關主題並從其分割區中擷取資料。
Redis 工作流程
Redis 的執行方式是使用用戶端-伺服器架構作為 NoSQL 資料庫系統。生產者和取用者之間鬆散耦合,在傳送訊息時不必彼此了解。
Redis 出於以下目的使用索引鍵和主要-次要節點:
- 索引鍵用於將類似訊息分組。例如,「電子郵件」是指向僅包含電子郵件訊息的資料存放區的索引鍵。
- 主要-次要節點用於執行訊息複寫。
當生產者將訊息傳送至特定節點時,Redis 透過檢查訊息的索引鍵將訊息交付給所有連線的訂閱者。取用者必須始終啟動並維持面向 Redis 伺服器的作用中連線才能接收訊息。這稱為連線交付語義。
訊息處理:Kafka 與Redis 發佈/訂閱
Apache Kafka 為開發人員提供可高度擴展的分散式簡訊系統。與此同時,Redis 提供豐富的資料結構,可讓應用程式快速將資料推送到多個節點。兩個系統的訊息佇列機制有幾點不同之處。
訊息大小
Kafka 和 Redis 在取用者和訂閱者之間傳送較少資料封包時效果最佳。
特別是,Redis 並非設計為在不影響輸送量的情況下處理大量資料。Redis 也不能儲存大量資料,因為 RAM 的容量小於磁碟儲存。
與此同時,儘管沒有專門為此目的而建置,Kakfa 仍可以支援相當大的訊息。如果 Kakfa 壓縮訊息並將其設定為分層儲存,則其可以處理高達 1GB 的訊息。Kafka 不是將所有訊息儲存在本機儲存空間中,而是使用遠端儲存空間來儲存完成的日誌檔案。
訊息交付
Kafka 取用者從訊息佇列中提取資料。每個 Kafka 取用者透過偏移追蹤它已讀取的訊息,此偏移值會更新,以便擷取後續訊息。取用者可以偵測和追蹤重複的訊息。
另一方面,Redis 會自動將訊息推送到連線的訂閱者。Redis 訂閱者會被動地等待從伺服器導向他們的傳入訊息。由於這是最多一次的交付設定,因此 Redis 訂閱者無法偵測重複的訊息。
訊息保留
Kafka 保留取用者閱讀後的訊息。因此,如果用戶端應用程式丟失擷取的資料,則可以從其訂閱的分割區再次請求該資料。透過設定訊息保留政策,使用者可以確定 Kafka 保留資料的時間長度。
相反地,Redis 不會在訊息交付後進行儲存。如果沒有訂閱者連線至串流,Redis 會捨棄訊息。即使訂閱者稍後連線至 Redis,捨棄的訊息也無法復原。
錯誤處理
Kafka 和 Redis 都可讓應用程式減少不可靠的訊息交付,但它們的做法有所不同。
Redis 中的錯誤處理側重於用戶端應用程式和 Redis 服務之間的互動。使用 Redis,開發人員可以解決諸如用戶端逾時、超出記憶體緩衝區容量以及用戶端限制上限等情況。由於其採用索引鍵-值對資料庫架構,Redis 無法像 Kafka 那樣提供強大的訊息錯誤處理功能。
Kafka 開發人員可以將錯誤的事件儲存在無效字母佇列中,重試或重新導向這些事件以將訊息一致地交付至用戶端應用程式。開發人員還可以使用 Kafka Connect API,在某些錯誤中自動重新啟動連接器任務。
性能差異:Kafka 與Redis 發佈/訂閱
總體而言,Apache Kafka 在發佈//訂閱簡訊方面的效能優於 Redis,因為 Kafka 是專門為資料串流而設計的。Redis 提供幾種不同的使用案例,在這些使用案例中無法使用 Kafka 。
平行處理
平行性是多個取用者同時接收相同訊息的能力。
Redis 不支援平行性。
另一方面,Kafka 允許同時將相同的訊息分發給多個取用者。 通常情況下,Kafka 取用者群組中的取用者輪流從分割區擷取新訊息。如果多個取用者群組中只有一個取用者,則其會擷取所有訊息。利用此設定和分割區複寫,可以在每個分割區複本中為每個取用者群組指派一個取用者。這就可讓所有取用者擷取類似的訊息序列。
輸送量
輸送量衡量每個系統每秒可處理的訊息數量。
Kafka 通常具有比 Redis 發佈/訂閱更高的輸送量。Kafka 處理更大規模的資料磁碟區,因為它不必等待每個訂閱者接收訊息即可移到另一個訂閱者。相反,Kafka 將當前訊息儲存在記憶體快取和儲存空間中,以最佳化讀取速度。
但是,如果取用者擷取訊息的速度不夠快,Kafka 的效能可能會降低,因為快取上的未讀訊息最終會被移除。在這種情況下,取用者必須從磁碟讀取訊息,讀取速度較慢。
與此同時,Redis 必須等待每位取用者的確認,在連線更多節點時會顯著降低其輸送量。因應措施是使用稱為管道傳輸的程序傳送多個請求,這樣可以降低其簡訊延遲。
延遲
Kafka 和 Redis 都適用於低延遲資料處理。Redis 提供較低的簡訊時間 (以毫秒為單位),而 Kafka 平均需要數十毫秒。
考慮到 Redis 主要在 RAM 上讀取和寫入資料,它在速度方面自然優於 Kafka。然而,Redis 可能無法在處理較大的訊息時維持超低延遲的資料操作。與此同時,Kafka 需要更多時間在不同的實體硬碟上複寫分割區以實現資料持久性,這會增加訊息交付時間的開銷。
可以最佳化 Redis 和 Kafka 的延遲,但您必須謹慎行事。例如,可以壓縮 Kafka 訊息以減少延遲,但生產者和取用者需要更多時間來解壓縮這些訊息。
Redis 的延遲可能由多種因素造成,包括作業環境、網路操作、緩慢的命令或分叉。為了減少分叉延遲,Redis 建議在以硬體虛擬機器 (HVM) 為基礎的現代 EC2 執行個體上執行發佈/訂閱交付系統。
容錯能力
Kafka 將所有資料寫入領先代理程式的儲存磁碟上,並將其複寫到不同的伺服器。當伺服器發生故障時,多個訂閱者會從備份分割區擷取資料。
與 Kafka 不同,Redis 預設不備份資料,使用者必須手動啟用該功能。Redis 使用記憶體內資料存放區,當電源關閉時會遺失所有資料。為了避免這種情況,開發人員開啟 Redis 資料庫 (RDB) 持久性以定期擷取 RAM 資料的快照並將其儲存在磁碟上。
使用時機:Kafka 與Redis 發佈/訂閱
Apache Kafka 是建置串流大型資料集且需要高復原能力的應用程式的最佳選擇。Kafka 最初作為單一的分佈式資料管道開發,能夠處理傳遞的數以兆計訊息。Kafka 跨不同伺服器複寫分割區,以防止節點發生故障時資料丟失。組織使用 Kafka 來支援應用程式、行動物聯網 (IoT) 裝置和微型服務之間的即時通訊。Kafka 也是日誌彙總、串流處理和其他雲端型資料整合任務的最佳選擇。
與此同時,Redis 為需要即時資料傳輸但可承受小量資料丟失的應用程式提供超低延遲事件分發。Redis 通常用作工作階段快取,以儲存經常存取的資料或傳遞緊急訊息。Redis 也適用於儲存遊戲、電子商務或社交媒體資料,以實現更順暢的使用者體驗。
差異摘要:Kafka 與Redis 發佈/訂閱
Apache Kafka |
Redis |
|
訊息大小 |
透過壓縮和分層儲存支援最大 1 GB 的訊息大小。 |
支持較小的訊息大小。 |
訊息交付 |
訂閱者從佇列中提取訊息。 |
Redis 的伺服器將訊息推送到連線的訂閱者。 |
訊息保留 |
擷取後保留訊息。 |
不保留訊息。 |
錯誤處理 |
簡訊層級中強大的錯誤處理。無效字母佇列、事件重試和重新導向。 |
您必須在應用程式層級處理 Redis 例外情況,其中包含逾時、用戶端限制和記憶體緩衝區容量。 |
平行處理 |
Kafka 支援平行性。多個取用者可以同時擷取相同的訊息。 |
不支援平行性。 |
輸送量 |
採用非同步讀取/寫入,因此具有更高的輸送量。 |
Redis 伺服器需要等待回覆才能將訊息傳送給另一個訂閱者,因此輸送量較低。 |
延遲 |
低延遲。預設進行資料複寫,因此執行速度稍微慢於 Redis。 |
分發較小的訊息時提供超低延遲。 |
容錯能力 |
自動將分割區備份到不同的代理程式。 |
預設不備份。使用者可以手動啟用 Redis 持續性。存在小型資料丟失的風險。 |
AWS 如何支援您的 Kafka 和 Redis 要求?
Amazon Web Services (AWS) 提供可擴展和受管的基礎設施,以支援您的發佈-訂閱 (pub/sub) 簡訊需求。
使用 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 輕鬆即時擷取和處理大量資料。可以建置私有存取的資料匯流排,以大規模提供高可用性串流節點。也可以順暢地連線其他 AWS 服務,例如 AWS IoT Core、Amazon Virtual Private Cloud (Amazon VPC) 和 Amazon Managed Service for Apache Flink。
使用 Amazon MemoryDB 為您的 Redis 工作負載提供高可用性的記憶體內儲存。可以執行高並行串流資料饋送以擷取使用者活動。此外,每天可以支援數百萬個媒體與娛樂應用程式的要求。
還可以使用 Amazon Simple Notification Service (Amazon SNS) 來建置發佈/訂閱簡訊系統,而不是採用 Redis 或 Kafka。可以採用可擴展、經濟高效的方式直接從應用程式向客戶或其他應用程式傳送訊息。Amazon SNS 提供以下若干功能:
- 分散式系統之間、微型服務之間、事件驅動型無伺服器應用程式之間的高輸送量、推送型、多對多簡訊。
- 訊息加密和流量隱私。
- 跨 AWS 類別的扇出功能。其中包括分析、運算、容器、資料庫、物聯網 (IoT)、機器學習 (ML)、安全性和儲存。
立即建立帳戶,開始使用 AWS 上的發佈/訂閱、Redis 和 Kafka。