Kafka Streams 和 ksqlDB 作為 Kafka 生態系統的核心元件,賦予開發者強大的實時資料處理能力。Kafka Streams 提供高層次的 DSL 和低層次的 Processor API,簡化開發流程,同時兼顧靈活性和控制力。ksqlDB 則以 SQL 語法簡化串流資料的查詢和處理,降低學習門檻。本文涵蓋無狀態和有狀態處理、時間語義、視窗操作以及進階狀態管理,並結合實際案例,例如 Twitter 流處理、遊戲排行榜和患者監測,展現 Kafka Streams 的應用廣度。此外,ksqlDB 的整合和佈署,以及生產環境的最佳實踐,也為讀者提供了全面的參考。

精通 Kafka Streams 與 ksqlDB:實時資料系統範例詳解

前言

在現代資料驅動的應用程式中,實時資料處理已成為不可或缺的一環。Apache Kafka 作為一個分散式串流處理平台,已經在業界獲得廣泛採用。而 Kafka Streams 和 ksqlDB 作為 Kafka 生態系統中的重要組成部分,為開發人員提供了強大的實時資料處理能力。本文將探討 Kafka Streams 的核心概念、功能特性以及實際應用案例,幫助讀者掌握使用 Kafka Streams 和 ksqlDB 構建實時資料系統的技能。

Kafka 簡介

Kafka 是一個分散式的串流處理平台,能夠高效地處理高吞吐量的資料。它的核心概念包括:

  • 通訊模型:Kafka 使用釋出-訂閱模式,允許生產者將資料釋出到特定的主題(Topic),而消費者則可以訂閱這些主題以接收資料。
  • 主題和分割槽:主題是 Kafka 中資料的邏輯分類別,而分割槽則是主題的物理分割,用於提高資料的平行處理能力。
  • 事件:在 Kafka 中,資料被表示為事件,每個事件都包含一個鍵值對和時間戳等資訊。
  • Kafka 叢集和代理:Kafka 叢集由多個代理(Broker)組成,這些代理共同負責儲存和轉發資料。

Kafka Streams 入門

Kafka Streams 是 Kafka 生態系統中的一個客戶端函式庫,用於構建實時資料處理應用程式。它提供了高層次的 DSL(Domain Specific Language)和低層次的 Processor API,允許開發人員根據需求選擇合適的程式設計模型。

主要特性

  • 可擴充套件性:Kafka Streams 應用程式可以輕鬆地擴充套件到多個例項,以提高處理能力和吞吐量。
  • 可靠性:透過利用 Kafka 的分割槽和複製機制,Kafka Streams 應用程式可以實作高用性和容錯能力。
  • 可維護性:Kafka Streams 提供了豐富的監控和管理功能,使得應用程式的維護和除錯變得更加容易。

無狀態處理

無狀態處理是指在處理資料時不需要依賴任何外部狀態或儲存。Kafka Streams 提供了豐富的無狀態處理操作,例如:

  • 過濾:根據條件過濾掉不需要的資料。
  • 分支:根據條件將資料分成不同的流。
  • 轉換:對資料進行轉換,例如格式轉換或內容修改。

例項:處理 Twitter 流

透過使用 Kafka Streams,可以輕鬆地構建一個實時處理 Twitter 流的應用程式。例如,可以使用 Kafka Streams 的 filter 方法過濾掉不包含特定關鍵字的推文,或者使用 map 方法將推文轉換成其他格式。

有狀態處理

有狀態處理是指在處理資料時需要依賴外部狀態或儲存。Kafka Streams 提供了豐富的有狀態處理操作,例如:

  • 聚合:對資料進行聚合操作,例如計算總和或平均值。
  • 連線:將多個資料流連線起來,以實作更複雜的處理邏輯。

例項:影片遊戲排行榜

透過使用 Kafka Streams,可以構建一個實時更新的影片遊戲排行榜。例如,可以使用 Kafka Streams 的 aggregate 方法計算每個玩家的得分,並使用 KTable 儲存最新的排行榜資料。

視窗和時間語義

Kafka Streams 提供了豐富的時間語義和視窗操作,以支援根據時間的資料處理。例如:

  • 視窗聚合:對一定時間範圍內的資料進行聚合操作。
  • 時間戳提取器:從資料中提取時間戳,以支援根據時間的處理。

例項:患者監測應用

透過使用 Kafka Streams,可以構建一個實時監測患者的應用程式。例如,可以使用 Kafka Streams 的視窗聚合功能計算患者的平均心率,並使用 KTable 儲存最新的監測資料。

先進狀態管理

Kafka Streams 提供了多種機制來管理和最佳化狀態儲存,例如:

  • 持久化儲存:將狀態儲存在磁碟上,以實作持久化。
  • 備份副本:建立狀態儲存的備份副本,以實作高用性。

例項:最佳化狀態儲存

透過使用 Kafka Streams 的先進狀態管理功能,可以最佳化狀態儲存的效能和可靠性。例如,可以使用 Materialized 介面建立一個持久化的狀態儲存,並使用 StandbyReplicas 組態建立備份副本。

事件驅動的商業架構與串流處理的重要性

在當今的商業環境中,企業越來越依賴事件驅動的架構,即透過即時活動資料來驅動業務決策和營運。事件串流平台已成為這種架構的核心組成部分,提供了一種機制來儲存、存取和處理連續不斷的事件資料。然而,要充分發揮事件串流平台的潛力,串流處理(stream processing)是不可或缺的。

為何串流處理至關重要

串流處理涉及對無窮無盡的資料流進行連續計算,這使得企業能夠即時地對變化做出反應,並根據最新的資料做出明智的決策。沒有串流處理,事件串流平台就無法實作其全部價值。

軟體正在改變世界

2011年,Marc Andreessen 在其文章《Why Software Is Eating the World》中指出,任何可以轉化為軟體的流程最終都會被轉化。這個預言已經成真,軟體已經滲透到各行各業,不僅改變了企業與世界互動的方式,也重新定義了企業本身。

新型應用架構的需求

隨著軟體在業務中的角色越來越重要,傳統圍繞資料函式庫的應用架構是否足以應對新的挑戰成為了一個問題。大多數資料函式庫,無論是傳統的關係型資料函式庫還是最新的鍵值儲存,都遵循一種被動儲存資料的正規化,等待命令檢索或修改資料。這種正規化主要是由導向人類的應用程式驅動的。

事件驅動架構下的新挑戰

在事件驅動的架構下,軟體更多地是透過程式設計方式觸發動作或對其他軟體的動作做出反應,而不是直接與人類互動。這種新的動態要求我們重新思考如何設計和實作應用程式,以更好地支援即時資料處理和事件驅動的業務流程。

內容解密:

本文討論了事件驅動架構在現代商業中的重要性,以及串流處理在這種架構中的關鍵作用。首先介紹了事件串流平台的概念及其在儲存和存取事件資料方面的作用。接著,文章闡述了串流處理對於實作事件串流平台全部價值的必要性。然後,參照Marc Andreessen的文章來闡述軟體如何改變世界,並重新定義企業。最後,文章提出了對新型應用架構的需求,特別是在事件驅動架構下,如何設計和實作能夠支援即時資料處理和業務流程的應用程式。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title KafkaStreams與ksqlDB實時資料系統

package "資料庫架構" {
    package "應用層" {
        component [連線池] as pool
        component [ORM 框架] as orm
    }

    package "資料庫引擎" {
        component [查詢解析器] as parser
        component [優化器] as optimizer
        component [執行引擎] as executor
    }

    package "儲存層" {
        database [主資料庫] as master
        database [讀取副本] as replica
        database [快取層] as cache
    }
}

pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中

master --> replica : 資料同步

note right of cache
  Redis/Memcached
  減少資料庫負載
end note

@enduml

此圖示說明瞭事件驅動架構如何透過事件串流平台和串流處理來實作即時資料處理,並最終影響業務決策與營運。同時,它也闡述了軟體如何重新定義企業,並引發對新型應用架構的需求。

前言

在資料工程師和資料科學家眼中,總是有無數技術爭相吸引我們的注意力。無論是瀏覽喜愛的論壇、掃描技術新聞、閱讀技術部落格,還是參加科技會議,我們面對的資訊量都足以令人感到不知所措。

然而,如果我們能夠靜下心來思考片刻,讓所有紛擾退去,便能從噪音中辨別出模式。我們正處於資料爆炸性增長的時代,這些技術大多被創造出來以幫助我們大規模儲存和處理資料。人們告訴我們,這些是針對現代問題的現代解決方案,我們圍坐在一起討論「大資料」,彷彿這是一個前衛的概念,但其實對資料量的關注只是故事的一半。

內容解密:

許多技術僅僅解決了資料量的問題,它們傾向於採用批次導向的資料處理技術。這涉及到對一段時間內累積的資料執行作業。在某些方面,這就像試圖一次性飲盡整個海洋。憑藉現代計算能力和正規化,一些技術確實成功實作了這一點,儘管通常以高延遲為代價。

相反,本文關注的是現代資料的另一個特性:資料在網路上以穩定且永不間斷的流動方式傳輸。本文所涵蓋的技術,Kafka Streams 和 ksqlDB,正是為實時處理這些連續的資料流而設計的,並且相比於「飲盡海洋」型別的技術,它們提供了巨大的競爭優勢。畢竟,許多商業問題都是時間敏感的,如果你需要在資料到來時立即豐富、轉換或對其做出反應,那麼 Kafka Streams 和 ksqlDB 將幫助你以簡便高效的方式實作這一點。

學習 Kafka Streams 和 ksqlDB 的重要性

學習 Kafka Streams 和 ksqlDB 也是熟悉流處理中更大概念的好方法。這包括以不同方式(流和表)建模資料、應用無狀態資料轉換、使用本地狀態進行更進階的操作(連線、聚合)、理解不同的時間語義和方法,將資料分組到時間桶/視窗中等。換句話說,你對 Kafka Streams 和 ksqlDB 的瞭解將幫助你區分和評估當前存在的不同流處理解決方案,以及未來可能出現的解決方案。

本文讀者

本文適合想要學習如何構建高度可擴充套件的流處理應用程式,以實時移動、豐富和轉換大量資料的資料工程師。這些技能通常用於支援商業智慧計劃、分析管道、威脅檢測、事件處理等。想要透過分析實時資料流來提升技能的資料科學家和分析師也會發現本文的價值,這是與傳統上主導這些領域的批次處理領域不同的令人興奮的方向。不需要具備 Apache Kafka 的先前經驗,但熟悉 Java 程式語言將使 Kafka Streams 教學更容易理解。

本文導覽

本文大致按照以下方式組織:

  • 第一章介紹 Kafka,並提供執行單節點 Kafka 叢集的教程。
  • 第二章介紹 Kafka Streams,從背景和架構評論開始,最後提供執行簡單 Kafka Streams 應用程式的教程。
  • 第三章和第四章討論 Kafka Streams 高階 DSL(特定領域語言)中的無狀態和有狀態運算元。每章都包含一個教程,演示如何使用這些運算元解決有趣的商業問題。

內容解密:

本文結構安排合理,從 Kafka 和 Kafka Streams 的基礎開始,逐步深入到更進階的流處理概念和技術,最後透過具體的教程和範例展示如何在實際業務場景中應用這些技術。透過學習本文,讀者將能夠掌握使用 Kafka Streams 和 ksqlDB 進行實時資料處理的核心技能。

本文內容導覽與使用

本文探討 Kafka Streams 與 ksqlDB 的技術細節與應用實務,內容涵蓋從基礎到進階的各種主題,以協助讀者全面掌握串流處理的核心技術。

本文章節概述

第 5 章:時間與視窗運算

探討時間在串流處理應用中的關鍵作用,並介紹如何利用視窗機制進行狀態化運算,包括視窗化的資料整合與彙總運算。章節透過醫療預測的實務案例,詳細闡述相關核心概念的實際應用。

第 6 章:狀態化處理的底層機制

深入分析 Kafka Streams 狀態化處理的內部運作原理,並提供針對狀態化應用的操作最佳化建議,協助開發者更有效地管理與維護 Kafka Streams 應用程式。

第 7 章:Processor API 的進階應用

介紹 Kafka Streams 的低階 Processor API,展示如何利用該 API 實作排程功能,並提供更細緻的狀態與後設資料存取能力。章節透過物聯網(IoT)場景的實務教學,加強讀者對該 API 的理解與應用能力。

第 8 章:ksqlDB 簡介與基礎操作

提供 ksqlDB 的技術背景與架構概述,並引導讀者完成 ksqlDB 伺服器的安裝與 CLI 操作,奠定使用 ksqlDB 進行串流處理的基礎。

第 9 章:ksqlDB 資料整合功能

探討 ksqlDB 的資料整合特性,並介紹其與 Kafka Connect 的結合應用,使讀者能夠更靈活地進行資料整合與處理。

第 10 章與第 11 章:ksqlDB SQL 語法詳解

詳細介紹 ksqlDB 的 SQL 語法,涵蓋不同集合型別的操作、推式查詢(Push Query)與拉式查詢(Pull Query)等主題。章節以 Netflix 追蹤影片變更的案例為基礎,逐步引導讀者掌握相關技術細節。

第 12 章:生產環境佈署

提供將 Kafka Streams 與 ksqlDB 應用佈署至生產環境的實用資訊,包括監控、測試與容器化等關鍵步驟,確保應用在生產環境中的穩定性與可維護性。

程式碼資源

本文所有程式碼範例均存放於 GitHub 倉函式庫(https://github.com/mitch-seymour/mastering-kafka-streams-and-ksqldb),讀者可下載並參考各章節對應的程式碼,以加深對技術細節的理解。

版本相容性說明

  • Kafka Streams 版本:本文根據 Kafka Streams 2.7.0 版本撰寫,儘管大多數程式碼可相容於其他版本,但仍建議參考官方檔案以確認最新相容性資訊。
  • ksqlDB 版本:本文根據 ksqlDB 0.14.0 版本撰寫,由於 ksqlDB 仍在快速發展中,建議使用不早於 0.14.0 的版本以確保範例程式碼的正確執行。

檔案排版規範

本文採用以下排版規範,以提升閱讀體驗:

  • 斜體字:表示新術語、網址、電子郵件地址、檔案名稱及副檔名。
  • 等寬字型:用於程式清單,以及段落中指涉的程式元素,如變數或函式名稱、資料函式庫、資料型別、環境變數、陳述式和關鍵字。
  • 等寬粗體:表示使用者應當依照顯示內容逐字輸入的命令或其他文字。
  • 等寬斜體字:表示應當由使用者提供或由上下文決定的值。

此外,本文透過不同的標記符號區分提示、注意事項和警告內容,以協助讀者更好地理解相關資訊。

程式碼範例的使用規範

本文提供的程式碼範例允許讀者在大多數情況下直接使用於自己的程式與檔案中,但若涉及大量程式碼的複製或在產品檔案中納入大量範例程式碼,則需取得授權許可。詳細的使用規範可參考本文相關章節說明。

本文使用

程式碼解說

本文中的程式碼範例皆會附上完整的解說,以協助讀者理解每段程式碼的作用和背後的邏輯。例如:

// 範例程式碼
public class Example {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

內容解密:

  1. 上述 Java 程式碼定義了一個名為 Example 的類別,其中包含一個 main 方法作為程式入口點。
  2. main 方法中,透過 System.out.println 輸出 “Hello, World!” 至控制檯。
  3. 該範例展示了 Java 程式的基礎結構,包括類別定義、主方法以及標準輸出操作。

重點整理

  1. 本文系統性地介紹 Kafka Streams 與 ksqlDB 的核心概念與技術細節。
  2. 章節安排由淺入深,涵蓋從基礎操作到進階應用的多個主題。
  3. 提供完整的程式碼範例與實務案例,協助讀者將理論知識轉化為實際操作能力。
  4. 詳細說明本文使用的技術版本與相容性資訊,確保讀者能夠正確組態開發環境。
  5. 提供進一步學習與探索的可能途徑。

快速認識 Kafka

根據世界經濟論壇的資料,全球資料儲存量已經遠遠超過可觀測宇宙中的星星數量,呈指數級增長。當我們思考這些資料時,可能會想到儲存在資料倉函式庫、關聯式資料函式庫或分散式檔案系統中的大量位元組。這些系統讓我們習慣於將資料視為靜態的,即資料儲存在某處,當需要處理時,對這些位元組執行查詢或作業。

這種觀點是傳統的資料處理方式。然而,雖然資料確實會在某些地方累積,但更常見的是,它處於流動狀態。許多系統會持續產生資料流,包括物聯網感測器、醫療感測器、金融系統、使用者和客戶分析軟體、應用程式和伺服器日誌等。即使最終會在某處安頓下來的資料,也很可能在到達最終目的地之前透過網路傳輸。

如果我們希望即時處理資料,在它流動的過程中,就不能簡單地等待它在某處累積,然後再按照我們的選擇執行查詢或作業。這種方法可以處理某些業務需求,但許多重要的應用場景需要我們在資料可用的情況下逐步處理、豐富、轉換和回應。因此,我們需要一種對資料有不同視角的技術:能夠存取流動狀態的資料,並快速有效地處理這些連續且無邊界的資料流的技術。Apache Kafka 正是為此而生。

Apache Kafka 簡介

Apache Kafka(簡稱 Kafka)是一個用於接收、儲存、存取和處理資料流的串流平台。雖然整個平台非常有趣,但本文重點關注我認為是 Kafka 最引人入勝的部分:

Kafka 的核心功能

Kafka 能夠處理來自各種來源的資料流,包括但不限於:

  • 物聯網(IoT)裝置
  • 應用程式日誌
  • 金融交易系統
  • 使用者行為分析

Kafka 的設計使其能夠高效地處理這些連續且無邊界的資料流,使其成為即時資料處理的理想選擇。

為何選擇 Kafka?

在需要即時處理和分析資料的應用場景中,Kafka 提供了一個強大的解決方案。它允許開發者構建能夠即時回應資料變化的系統,這在許多行業中都是至關重要的,例如金融服務、醫療保健和電子商務。

Kafka 簡介與其在串流資料處理中的角色

Kafka 作為一個分散式串流處理平台,在現代資料驅動系統中扮演著至關重要的角色。它簡化了不同系統之間的通訊,並提供了一個高效、容錯的資料處理機制。本章將介紹 Kafka 的基本概念、架構以及其在串流資料處理中的應用。

Kafka 的通訊模型

傳統的客戶端-伺服器模型在多系統通訊時會變得複雜且難以維護。Kafka 透過引入發布-訂閱(pub/sub)模型,簡化了系統間的通訊。

客戶端-伺服器模型的缺點

  • 系統間緊密耦合,維護困難
  • 同步通訊缺乏錯誤處理機制
  • 不同系統可能採用不同的通訊協定和擴充套件策略
  • 接收系統容易被請求淹沒
  • 通訊內容不具重播性,難以重建系統狀態

Kafka 的發布-訂閱模型

Kafka 作為一個中央通訊樞紐,讓系統可以非同步地傳送和接收資料,無需知道彼此的存在。

主要元件
  • 生產者(Producers):將資料釋出到 Kafka 主題(topics)
  • 主題(Topics):命名資料流,用於儲存相關資料
  • 消費者(Consumers):從主題中讀取資料,可組成消費者群組(consumer groups)來分配工作
優勢
  • 系統解耦合,易於維護
  • 非同步通訊提供更強的傳遞保證
  • 標準化的通訊協定和容錯機制
  • 消費者可按自身處理能力讀取資料
  • 重點關注資料本身(事件),而非通訊層細節
  • 系統可透過重播事件來重建狀態

Kafka 的架構與儲存機制

Kafka 將資料儲存在主題中,這些主題本質上是分散式的、可容錯的日誌。資料以事件的形式儲存,並支援多個消費者以不同速度讀取同一資料流。

資料儲存特點

  • 資料以原始位元組儲存,提供高度靈活性
  • 資料持久化儲存,確保不會丟失
  • 支援多消費者讀取同一主題

高用性與容錯性

Kafka 透過多副本機制和消費者群組實作高用性和容錯性。

資料層面的容錯

  • 資料在多個 broker 之間複製,確保資料不會因單點故障而丟失

處理層面的容錯

  • 消費者群組內的成員可動態調整,確保資料處理的連續性

安裝與執行 Kafka

本章最後將提供一個安裝和執行 Kafka 的教程,讓讀者可以實際操作並體驗 Kafka 的功能。

內容解密:
  1. 圖表中的 生產者 代表將資料釋出到 Kafka 主題的應用程式或服務。
  2. Kafka 主題 是命名資料流,用於儲存相關資料。
  3. 消費者 從 Kafka 主題中讀取資料,可以組成 消費者群組 以分配工作負載。
  4. 資料儲存在 Kafka 叢集 中,提供持久化和容錯能力。

這個架構簡化了系統間的通訊,並提供了高效、靈活的資料處理機制。