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…