Kafka 介紹 Kafka 是一個開源的分散式流式平臺,它可以處理大量的實時數據,並提供高吞吐量,低延遲,高可靠性和高可擴展性。Kafka 的核心組件包括生產者(Producer),消費者(Consumer),主題(Topic),分區(Partition),副本(Replica),日誌(Log), ...
Kafka 介紹
Kafka 是一個開源的分散式流式平臺,它可以處理大量的實時數據,並提供高吞吐量,低延遲,高可靠性和高可擴展性。Kafka 的核心組件包括生產者(Producer),消費者(Consumer),主題(Topic),分區(Partition),副本(Replica),日誌(Log),偏移量(Offset)和代理(Broker)。Kafka 的主要特點有:
- 數據磁碟持久化:Kafka 將消息直接寫入到磁碟,而不依賴於記憶體緩存,從而提高了數據的持久性和容錯性。
- 零拷貝:Kafka 利用操作系統的零拷貝特性,減少了數據在內核空間和用戶空間之間的複製,降低了 CPU 和記憶體的開銷。
- 數據批量發送:Kafka 支持生產者和消費者批量發送和接收數據,減少了網路請求的次數和開銷。
- 數據壓縮:Kafka 支持多種壓縮演算法,如 gzip,snappy,lz4 等,可以有效地減少數據的大小和傳輸時間。
- 主題劃分為多個分區:Kafka 將一個主題劃分為多個分區,每個分區是一個有序的消息隊列,分區之間可以並行地讀寫數據,提高了系統的併發能力。
- 分區副本機制:Kafka 為每個分區設置多個副本,分佈在不同的代理節點上,保證了數據的冗餘和一致性。其中一個副本被選為領導者(Leader),負責處理該分區的讀寫請求,其他副本為追隨者(Follower),負責從領導者同步數據,併在領導者失效時進行故障轉移。
Kafka 最初是為分散式系統中海量日誌處理而設計的。它可以通過持久化功能將消息保存到磁碟直到過期,並讓消費者按照自己的節奏提取消息。與它的前輩不同(RabbitMQ、ActiveMQ),Kafka 不僅僅是一個消息隊列,它還是一個開源的分散式流處理平臺。
Kafka 的應用場景
Kafka 作為一款熱門的消息隊列中間件,具備高效可靠的消息非同步傳遞機制,主要用於不同系統間的數據交流和傳遞。下麵給大家介紹一下 Kafka 在分散式系統中的 7 個常用應用場景。
- 日誌處理與分析
- 推薦數據流
- 系統監控與報警
- CDC(數據變更捕獲)
- 系統遷移
- 事件溯源
- 消息隊列
1. 日誌處理與分析
日誌收集是 Kafka 最初的設計目標之一,也是最常見的應用場景之一。可以用 Kafka 收集各種服務的日誌,如 web 伺服器、伺服器日誌、資料庫伺服器等,通過 Kafka 以統一介面服務的方式開放給各種消費者,例如 Flink、Hadoop、Hbase、ElasticSearch 等。這樣可以實現分散式系統中海量日誌數據的處理與分析。
下圖是一張典型的 ELK(Elastic-Logstash-Kibana)分散式日誌採集架構。
- 購物車服務將日誌數據寫在 log 文件中。
- Logstash 讀取日誌文件發送到 Kafka 的日誌主題中。
- ElasticSearch 訂閱日誌主題,建立日誌索引,保存日誌數據。
- 開發者通過 Kibana 連接到 ElasticSeach 即可查詢其日誌索引內容。
2. 推薦數據流
流式處理是 Kafka 在大數據領域的重要應用場景之一。可以用 Kafka 作為流式處理平臺的數據源或數據輸出,與 Spark Streaming、Storm、Flink 等框架進行集成,實現對實時數據的處理和分析,如過濾、轉換、聚合、視窗、連接等。
淘寶、京東這樣的線上商城網站會通過用戶過去的一些行為(點擊、瀏覽、購買等)來和相似的用戶計算用戶相似度,以此來給用戶推薦可能感興趣的商品。
下圖展示了常見推薦系統的工作流程。
- 將用戶的點擊流數據發送到 Kafka 中。
- Flink 讀取 Kafka 中的流數據實時寫入數據湖中其進行聚合處理。
- 機器學習使用來自數據湖的聚合數據進行訓練,演算法工程師也會對推薦模型進行調整。
這樣推薦系統就能夠持續改進對每個用戶的推薦相關性。
3. 系統監控與報警
Kafka 常用於傳輸監控指標數據。例如,大一點的分散式系統中有數百台伺服器的 CPU 利用率、記憶體使用情況、磁碟使用率、流量使用等指標可以發佈到 Kafka。然後,監控應用程式可以使用這些指標來進行實時可視化、警報和異常檢測。
下圖展示了常見監控報警系統的工作流程。
- 採集器(agent)讀取購物車指標發送到 Kafka 中。
- Flink 讀取 Kafka 中的指標數據進行聚合處理。
- 實時監控系統和報警系統讀取聚合數據作展示以及報警處理。
4. CDC(數據變更捕獲)
CDC(數據變更捕獲)用來將資料庫中的發生的更改以流的形式傳輸到其他系統以進行複製或者緩存以及索引更新等。
Kafka 中有一個連接器組件可以支持 CDC 功能,它需要和具體的數據源結合起來使用。數據源可以分成兩種:源數據源( data source ,也叫作“源系統”)和目標數據源( Data Sink ,也叫作“目標系統”)。Kafka 連接器和源系統一起使用時,它會將源系統的數據導人到 Kafka 集群。Kafka 連接器和目標系統一起使用時,它會將 Kafka 集群的數據導人到目標系統。
下圖展示了常見 CDC 系統的工作流程。
- 源數據源將事務日誌發送到 Kafka。
- Kafka 的連接器將事務日誌寫入目標數據源。
- 目標數據源包含 ElasticSearch、Redis、備份數據源等。
5. 系統遷移
Kafka 可以用來作為老系統升級到新系統過程中的消息傳遞中間件(Kafka),以此來降低遷移風險。
例如,在一個老系統中,有購物車 V1、訂單 V1、支付 V1 三個服務,現在我們需要將訂單 V1 服務升級到訂單 V2 服務。
下圖展示了老系統遷移到新系統的工作流程。
- 先將老的訂單 V1 服務進行改造接入 Kafka,並將輸出結果寫入 ORDER 主題。
- 新的訂單 V2 服務接入 Kafka 並將輸出結果寫入 ORDERNEW 主題。
- 對賬服務訂閱 ORDER 和 ORDERNEW 兩個主題併進行比較。如果它們的輸出結構相同,則新服務通過測試。
6. 事件溯源
事件溯源是 Kafka 在微服務架構中的重要應用場景之一。可以用 Kafka 記錄微服務間的事件,如訂單創建、支付完成、發貨通知等。這些事件可以被其他微服務訂閱和消費,實現業務邏輯的協調和同步。
簡單來說事件溯源就是將這些事件通過持久化存儲在 Kafka 內部。如果發生任何故障、回滾或需要重放消息,我們都可以隨時重新應用 Kafka 中的事件。
7. 消息隊列
Kafka 最常見的應用場景就是作為消息隊列。 Kafka 提供了一個可靠且可擴展的消息隊列,可以處理大量數據。
Kafka 可以實現不同系統間的解耦和非同步通信,如訂單系統、支付系統、庫存系統等。在這個基礎上 Kafka 還可以緩存消息,提高系統的可靠性和可用性,並且可以支持多種消費模式,如點對點或發佈訂閱。
參考資料
- https://levelup.gitconnected.com/top-8-kafka-use-cases-distributed-systems-d47fc733c7c1
- https://blog.bytebytego.com/p/ep76-netflixs-tech-stack
- Apache Kafka Benefits & Use Cases。https://www.confluent.io/learn/apache-kafka-benefits-and-use-cases/
總結
自此本文介紹了 Kafka 在分散式系統中的 7 大應用場景,感謝大家閱讀。
關註公眾號【waynblog】每周分享技術乾貨、開源項目、實戰經驗、國外優質文章翻譯等,您的關註將是我的更新動力!