用一根“數據中樞神經”串起業務從事件流到 Apache Kafka

1. 為什么是“事件流”?

在一個軟件定義、自動化、永遠在線的世界里,系統之間最需要的是:把發生了什么這件事,第一時間、按正確順序、可靠地傳到該知道的人/系統那里。
事件流就像企業的中樞神經:它把數據庫更新、設備信號、用戶點擊、訂單變化……都變成事件,持續流動與解釋;于是正確的信息,就能在正確的時間到達正確的地方。

2. 事件流是什么

直觀比喻:一條條“事件”像血液里的紅細胞,被心臟泵(平臺)源源不斷地送往各個器官(系統/服務),器官各取所需。

正式定義

  • 采集:從數據庫、傳感器、移動端、云服務、應用等實時捕獲事件;
  • 存儲:把事件持久化,便于回看/回放;
  • 處理:對事件實時回溯處理與響應;
  • 分發:把事件路由到不同的目標技術棧/系統。

目標:讓數據持續流動 + 被正確解釋

3. 常見業務場景

  • 金融交易:證券撮合、支付風控、清結算流水等的毫秒級處理;
  • 車隊/物流:車輛/貨運實時定位與監控
  • 工業/IoT:工廠、風電場的傳感器數據持續采集與分析;
  • 零售/旅行/移動應用:對用戶交互與訂單即時響應;
  • 醫療:對病患生命體征監測與預警
  • 數據平臺/數據共享:跨部門連接、存儲與供給數據;
  • 事件驅動架構/微服務:系統之間用事件解耦、提升彈性與演進速度。

4. Kafka 是什么,為何選擇它?

Apache Kafka? 是一個事件流平臺,把三件事做到了極致:

  1. 發布/訂閱:把事件寫入/讀取到主題;也能做數據的持續進/出(CDC、導出)
  2. 持久存儲:事件可長期保存,按需回放
  3. 流式處理:對事件實時回顧式處理

它的實現是分布式、可橫向擴展、彈性容錯與安全的:可以在裸機/虛機/容器、本地/云上部署;既可自管也可用托管服務

5. Kafka 如何工作

5.1 服務器側

  • Broker(代理):存儲與提供事件讀寫的核心節點,組成集群
  • Kafka Connect:把外部系統(如 MySQL/PostgreSQL/對象存儲/其他 Kafka)與 Kafka 進行持續數據集成

容錯:某個節點掛了,別的節點接管;配合復制機制,實現零數據丟失業務連續

5.2 客戶端側

  • 生產者:把事件發布到主題;
  • 消費者:從主題訂閱/處理事件;
  • 多語言:Java/Scala(含 Kafka Streams 高階庫)、Go、Python、C/C++、REST 等;
  • 特性:并行、可擴展、容錯,網絡抖動或機器故障也能穩定運行。

6. 核心概念與術語

6.1 事件(Event)

記錄“某件事發生”的事實,包含key、value、timestamp,可帶headers
例:

  • key: "Alice"
  • value: "向 Bob 支付了 200 美元"
  • timestamp: 2020-06-25 14:06

6.2 生產者 & 消費者

  • 生產者(Producer):寫事件;
  • 消費者(Consumer):讀/處理事件;
    兩者完全解耦,這是系統可擴展的關鍵;Kafka 還提供恰好一次(Exactly-Once) 處理語義。

6.3 主題(Topic)

像文件夾,事件像其中的文件。

  • 多生產者/多訂閱者
  • 可重復消費(不會因一次消費而刪除);
  • 保留策略:按主題設置保留時間/大小,到期再清理;
  • 長存無憂:性能對數據規模基本常數級

6.4 分區(Partition)

主題會被切分到多個分區,分布在不同 Broker 上:

  • 讀寫可并行擴展;
  • 相同 key 的事件進入同一分區,保證局部有序
  • 消費者按分區順序讀取,順序與寫入一致。

6.5 復制(Replication)

生產常用副本因子=3:每個分區有 3 份數據,可跨機房/跨區域。

  • 目的:高可用 + 容錯 + 維護無感知

7. Kafka 的五大 API(Java/Scala 生態)

  1. Admin API:管控主題、Broker、ACL 等;
  2. Producer API:把事件寫入一個或多個主題;
  3. Consumer API:訂閱主題并處理事件;
  4. Kafka Streams API:寫流處理應用/微服務(變換、聚合、連接、窗口、事件時間等);
  5. Kafka Connect API:用連接器把外部系統與 Kafka 連接(通常直接復用社區現成連接器即可)。

8. 一圖讀懂

在這里插入圖片描述

  • 相同 key(如 userId)落在同一分區,消費順序可控;
  • 多消費組互不影響:一個做實時計算,一個做落庫回放;
  • 存儲即日志:既能在線處理也能事后回放

9. 快速上手路線

  1. 安裝/啟動:準備 Zookeeper(或用 Kraft 模式)、啟動 Broker;
  2. 創建主題:設置分區數與副本因子;
  3. 生產/消費:用命令行或 SDK 寫入/讀取;
  4. 試試回放:調整消費者位點,從歷史時間重讀;
  5. 引入 Connect:接 MySQL/PG 做 CDC,或導出到對象存儲;
  6. 嘗試 Streams:實現一個實時聚合/窗口統計小功能。

10. 實用示例

10.1 用 Go(segmentio/kafka-go)寫個最小生產者/消費者

Producer(寫入事件):

w := &kafka.Writer{Addr:     kafka.TCP("localhost:9092"),Topic:    "payments",Balancer: &kafka.Hash{}, // 依據 Key 落固定分區,保證局部順序
}
_ = w.WriteMessages(context.Background(),kafka.Message{Key:   []byte("Alice"),Value: []byte("Paid $200 to Bob"),Time:  time.Now(),},
)

Consumer(訂閱處理):

r := kafka.NewReader(kafka.ReaderConfig{Brokers:  []string{"localhost:9092"},Topic:    "payments",GroupID:  "realtime-risk",MinBytes: 1, MaxBytes: 10e6,
})
for {m, err := r.ReadMessage(context.Background())if err != nil { break }log.Printf("key=%s val=%s ts=%v", m.Key, m.Value, m.Time)
}

10.2 Kafka Streams(Java)概念化拓撲

KStream<String, Payment> payments = builder.stream("payments");
KTable<String, BigDecimal> total = payments.groupByKey().aggregate(() -> BigDecimal.ZERO,(user, p, agg) -> agg.add(p.amount())); // 按用戶累加
total.toStream().to("payment_totals");

11. 設計與實踐要點

  • 主題建模:按業務領域拆分;命名清晰(如 orders, payments, user-events)。

  • 分區策略

    • 選擇合適 key(如 userId / deviceId),保障數據傾斜可控順序需求
    • 分區數不是越多越好,結合吞吐/消費者并行度規劃。
  • 可靠性設置

    • 生產端 acks=all、合理 retries/backoff、開啟冪等與(必要時)事務以實現恰好一次
    • 消費端用消費組水平擴展,妥善處理再均衡。
  • 存儲與回放

    • 為主題設置保留時間/大小
    • 需要事后分析/重算時,直接回放歷史事件
  • 隔離與安全:多租戶下用命名規范、ACL、配額與 Schema 管理。

  • 監控與容量:關注端到端延遲、消費積壓(lag)、磁盤與網絡水位。

12. 常見誤區

  • 把 Kafka 當“傳統消息隊列”用:事件不會因消費而刪除,要理解保留回放
  • 亂選分區鍵:導致熱點分區順序需求無法滿足
  • 只配 acks=1:在故障時容易丟數
  • 輕視死信/重試:復雜場景要設計重試與旁路
  • 把流處理全部塞進數據庫:實時計算應在流處理側完成。

13. 術語速記

  • Event:發生的事實(key/value/ts/headers)。
  • Topic / Partition:事件的存儲與并行單位(分區內有序)。
  • Producer / Consumer:寫入/讀取事件的客戶端。
  • Replication:分區副本(常見 RF=3)。
  • Kafka Streams:寫實時計算應用的高階庫。
  • Kafka Connect:連接外部系統的進/出平臺。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94301.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94301.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【RAGFlow代碼詳解-4】數據存儲層

數據庫基礎設施 RAGFlow 使用關系數據庫&#xff08;MySQL 或 PostgreSQL&#xff09;作為主要元數據存儲&#xff0c;通過具有連接池和重試機制的 Peewee ORM 進行管理。 連接管理 數據庫連接通過 service_conf.yaml 和環境變量進行配置。該系統支持具有可配置連接池的 MySQL …

ES_映射

一、 映射&#xff08;Mapping&#xff09;是什么&#xff1f; 簡單來說&#xff0c;映射就像是關系型數據庫中的表結構定義&#xff08;Schema&#xff09;。它定義了索引&#xff08;Index&#xff09;中的文檔&#xff08;Document&#xff09;可以包含哪些字段&#xff08;…

【Linux | 網絡】多路轉接IO之poll

一、poll函數二、poll的優缺點三、實現poll服務器&#xff08;只關心讀事件&#xff09;3.1 Log.hpp&#xff08;日志&#xff09;3.2 Lockguard.hpp&#xff08;自動管理鎖&#xff09;3.3 Socket.hpp&#xff08;封裝套接字&#xff09;3.4 PollServer.hpp&#xff08;服務端…

一站式資源共享平臺模板,助力快速搭建專屬資源站源碼

內容目錄一、詳細介紹二、效果展示1.部分代碼2.效果圖展示三、學習資料下載一、詳細介紹 這個資源分享網站模板是一個功能完整、設計現代的單頁網站&#xff0c;非常適合快速搭建資源分享平臺。以下是關于這個模板的詳細介紹&#xff0c;幫助你更好地理解并發布到自己的網站&a…

ngnix的部分配置

1. 禁止特定IP地址訪問你可以通過在Nginx配置文件中添加deny指令來阻止特定IP地址或IP地址段的訪問。server {listen 80;server_name example.com;location / {deny 192.168.1.0/24;allow all;} }2. 允許特定IP地址訪問如果你想允許只有特定IP地址或IP地址段的訪問&#xff0c;…

Qwt7.0-打造更美觀高效的Qt開源繪圖控件庫

概述 Qt 生態里能畫圖的庫不多&#xff0c;主流的為QCustomPlot、Qwt、Qt Charts和KDChart&#xff0c;Qt6.8之后把原來的 Qt Charts&#xff08;2D&#xff09; 與 Qt DataVisualization&#xff08;3D&#xff09; 合并為統一的Qt Graphs模塊&#xff08;注意不是Qt Graphic…

NFC線圈設計計算

對工作于13.56MHz的電感耦合的NFC系統,針對小距離的傳統天線通常是環形或者矩形的扁平線圈。 圓形扁平線圈計算評估 對于二階估計,我們可以由匝數決定的電感等式為 考慮到線圈的物理參數,設置平均直徑:D_averD0-N(gw) 線圈周長: &#xff1b;d2*(w t)/π 初始設置中的這種電感…

mac設置鼠標滾輪方向

mac中滾輪的滑動方向和windows是相反的&#xff0c;如果需要設置和windows相同&#xff0c;設置如下&#xff1a;將自然滾動關閉即可。

QSpinBox的用法及其使用QSS對其美化

摘要 在現代應用程序開發中&#xff0c;提供一個直觀且用戶友好的界面至關重要。Qt框架提供了豐富的控件和工具&#xff0c;幫助開發者實現這一目標。本文將詳細介紹如何使用Qt的QSpinBox控件讓用戶輸入數值&#xff0c;并通過Qt Style Sheets (QSS) 美化界面&#xff0c;提升…

18 繼續學習

要設計出一個好的系統&#xff0c;需要多年的知識積累。有一個捷徑是研究真實世界的系統架構。本文將介紹一些有幫助的閱讀材料。 務必留意那些真實系統之間共通的原理和相同的底層技術。研究每個技術并了解它解決了什么問題&#xff0c; 這是一個鞏固基礎知識和完善設計過程的…

深度學習篇---混淆矩陣

要理解混淆矩陣&#xff08;Confusion Matrix&#xff09;&#xff0c;我們可以從它的名字入手&#xff1a;它本質是一張 “幫你理清模型預測結果到底‘混淆’在哪里” 的表格&#xff0c;核心作用是評估分類模型的表現 —— 比如判斷一張圖片是 “貓” 還是 “狗”、一封郵件是…

MySQL重大隱患!mysqlpump的--set-gtid-purged參數在5.7和8.0的雷區

MySQLPump是MySQL官方提供的一個用于備份和恢復MySQL數據庫的工具。它于MySQL 5.7.8版本中首次引入&#xff0c;旨在提供一種快速、可靠且高效的備份和恢復解決方案。MySQL Pump首次支持了并行導出、壓縮導出&#xff0c;可以利用多核CPU來提高備份能力&#xff0c;在效率上要比…

低質量視頻變高清AI:告別模糊,重現清晰畫質

在數字時代&#xff0c;視頻內容的創作和消費日益普及&#xff0c;然而&#xff0c;許多早期拍攝或存儲的視頻&#xff0c;由于技術限制或壓縮等原因&#xff0c;往往存在畫質不佳的問題&#xff0c;如模糊、噪點多、分辨率低等。這不僅影響觀看體驗&#xff0c;也限制了這些珍…

Linux入門教程 第十二章 防火墻

文章目錄前言一、 iptables 概述Netfilter二、iptables 的表、鏈結構2.1 ptables的四表五鏈結構介紹2.1.1 四表五鏈2.1.2 四表2.1.3 **五鏈**2.2 數據包過濾的匹配流程&#xff08;數據包到防火墻&#xff09;2.2.1 規則鏈之間的匹配順序:主機型防火墻:2.2.2 規則鏈內的匹配順序…

單詞搜索+回溯法

題目&#xff1a;思考&#xff1a; 1.經典回溯 實現&#xff1a; class Solution { public:bool find_word(vector<vector<char>>&board,string word,int pos,int i,int j){bool retfalse;if (posword.size()-1) return board[i][j]word[pos];if (board[i][j…

【嵌入式開發 Linux 常用命令系列 8 -- git checkout 解沖突詳細介紹】

文章目錄1. Git 沖突產生的場景2. 沖突標記符號解釋3. git checkout --ours 和 git checkout --theirs語法含義使用場景4. 操作完成后的流程5. 舉例演示1. Git 沖突產生的場景 當你在 git merge、git rebase、git cherry-pick 等操作時&#xff0c;如果 同一個文件的同一部分在…

16-day13強化學習和訓練大模型

強化學習 強化學習和監督學習是機器學習中的兩種不同的學習范式 強化學習&#xff1a;目標是讓智能體通過與環境的交互&#xff0c;學習到一個最優策略&#xff0c;以最大化長期累積獎勵。 例如&#xff0c;在機器人導航任務中&#xff0c;智能體需要學習如何在復雜環境中移動&…

OpenAI o1:OpenAI最新推出的AI大語言模型,更擅長推理也更貴

本文轉載自&#xff1a;OpenAI o1&#xff1a;OpenAI最新推出的AI大語言模型&#xff0c;更擅長推理也更貴 - Hello123工具導航 ** 一、&#x1f916; OpenAI o1 是什么&#xff1f; OpenAI o1 是 2024 年推出的推理特化型 AI 模型&#xff0c;主打 “慢思考、深分析”&#…

自然語言處理——03 RNN及其變體

1 認識RNN 1.1 概念循環神經網絡 RNN &#xff08;Recurrent Neural Network&#xff0c;簡稱RNN&#xff09;——處理序列數據的神經網絡&#xff1b;一般以序列數據作為輸入&#xff0c;通過網絡內部的結構設計有效捕捉序列之間的關系特征&#xff0c;一般也是以序列形式進行…

量子計算基礎

量子計算 量子計算一般由三個基本步驟組成&#xff1a;制備輸入量子態、對于量子態執行幺正變換以及測量輸出態&#xff0c;這里將介紹這三個基本要素。 1 量子態 與經典計算中比特(bit)的概念相對應&#xff0c;量子計算中最小信息載體和處理單位是量子比特(quantum bit, or t…