当前位置: 首页 > news >正文

Kafka: 一条消息的完整“生命之旅”

Kafka: 一条消息的完整“生命之旅”

Kafka 是一个高性能、高吞吐量的分布式流数据平台,常被用作消息队列、事件流总线或数据管道。它的核心设计目标是处理海量实时数据流。

为了让您直观理解,我们先看一条消息是如何“走完一生”的:

graph LR A[生产者] -->|1. 发送消息| B[指定主题的某个分区] B --> C[分区领导者副本] C -->|2. 复制| D[分区跟随者副本] D --> E[已提交的消息] E -->|3. 拉取消息| F[消费者组] F --> G[消费者实例]

一句话概括流程生产者将消息发布到某个主题的特定分区;分区的领导者副本接收并持久化消息,同时同步给跟随者副本消费者从分区拉取消息进行处理。


一、 核心角色与概念(先认识“演员”)

  1. Producer(生产者):数据的来源,负责创建并发送消息到Kafka。

  2. Consumer(消费者):数据的终点,负责从Kafka拉取并处理消息。

  3. Broker(代理服务器):Kafka服务实例,一个Kafka集群由多个Broker组成,负责消息的存储和传递。

  4. Topic(主题):消息的逻辑分类,你可以把它想象成一个数据库的表名或一个消息队列的名称。生产者向Topic发送消息,消费者订阅Topic来消费消息。

  5. Partition(分区)这是Kafka实现高并发和水平扩展的关键!

    • 每个Topic可以被分成一个或多个Partition。
    • Partition是物理上的概念,每个Partition对应磁盘上的一个文件夹。
    • 消息在同一个Partition内是有序的(严格按照写入顺序),但不同Partition之间的顺序无法保证。
    • 分区使得消息可以被并行生产和消费。
  6. Replica(副本):每个Partition可以有多个副本(通常为3个),分布在不同的Broker上,用于数据冗余和高可用。其中一个副本是Leader,负责所有的读写请求;其他副本是Follower,只负责从Leader同步数据。

  7. Consumer Group(消费者组)

    • 由多个Consumer实例组成,共同订阅一个或多个Topic。
    • Kafka的核心机制:一个Partition在同一时间只能被同一个Consumer Group内的一个Consumer消费。
    • 通过这种方式,Consumer Group实现了对Topic消息的负载均衡并行消费

二、 一条消息的完整“生命之旅”(图文详解)

让我们跟随一条消息“Hello Kafka”,看看它从诞生到被处理的完整路径。

场景:一个订单服务(Producer)产生了一条“订单创建”的消息,需要被库存服务和通知服务(Consumers)消费。

sequenceDiagram participant P as 生产者<br/>(订单服务) participant B1 as Broker 1<br/>(Leader) participant B2 as Broker 2<br/>(Follower) participant B3 as Broker 3<br/>(Follower) participant CG1 as 消费者组A<br/>(库存服务) participant CG2 as 消费者组B<br/>(通知服务) Note over P,B3: 第1步:生产消息 P->>B1: 发送消息到主题“orders”<br/>分区0(Leader) B1->>B2: 复制消息到Follower B1->>B3: 复制消息到Follower B2-->>B1: 确认同步 B3-->>B1: 确认同步 Note over B1: 消息已提交<br/>(持久化成功) Note over B1,CG2: 第2步:消费消息(不同组独立消费) CG1->>B1: 消费者A1拉取分区0的消息 B1-->>CG1: 返回消息“订单创建” CG2->>B1: 消费者B1拉取分区0的消息 B1-->>CG2: 返回消息“订单创建”

流程分步拆解:

第一阶段:生产与存储(写入)

  1. 创建消息:订单服务(Producer)创建一条消息,内容包含订单ID、用户信息等。
  2. 选择目标:Producer知道消息要发往orders这个Topic。它根据配置的分区策略(如轮询、按Key哈希)决定将这条消息发送到该Topic的哪个Partition(假设是Partition 0)。
  3. 找到Leader:Producer从集群元数据中得知orders-0分区的Leader副本在Broker 1上。
  4. 发送与确认
    • Producer将消息发送给Broker 1
    • Broker 1(Leader)将消息写入其本地日志文件。
    • Leader同时将消息推送给该分区的所有Follower副本(Broker 2Broker 3)。
    • Follower副本将消息写入自己的日志后,向Leader发送确认。
    • 当Leader收到所有同步副本(根据配置)的确认后,才认为这条消息已提交,并向Producer返回成功响应。
    • 这就是Kafka的持久化保证

第二阶段:消费与处理(读取)

  1. 消费者组订阅:库存服务(Consumer Group A)和通知服务(Consumer Group B)都订阅了orders这个Topic。
  2. 分配分区
    • Kafka会为每个Consumer Group协调,将Topic的各个Partition分配给组内的不同Consumer实例。
    • 假设orders有3个分区,而Consumer Group A有2个实例(C1, C2)。那么分区分配可能是:C1消费P0P1C2消费P2
    • 每个分区在同一时刻只能被一个消费者读取,这保证了分区内消息的顺序性。
  3. 拉取消息
    • 库存服务的消费者C1Broker 1发起拉取请求,请求消费orders-0分区中它尚未读取的消息。
    • Broker 1将消息返回给C1
    • 关键点:消费者主动拉取,而不是Broker推送。消费者可以控制消费速度和位置。
  4. 提交偏移量C1处理完消息后,会向Kafka提交一个偏移量。偏移量就像是书签,记录了当前消费者在这个分区中消费到了哪个位置。这样即使消费者重启,也能从上次的位置继续消费,不会丢失消息也不会重复处理。
  5. 独立消费非常重要!通知服务(Consumer Group B)会完整地、独立地重复步骤6-8。也就是说,orders-0分区的同一条消息,会被Group A和Group B各消费一次。这是实现“发布-订阅”模式的基础。

三、 核心特性与优势(为什么是Kafka?)

通过上面的流程,我们可以总结出Kafka的几大核心优势:

  • 高吞吐、低延迟:顺序磁盘I/O、批量发送、零拷贝等技术。
  • 高可扩展性:通过增加Broker和分区,可以轻松水平扩展。
  • 高可用性与持久化:多副本机制确保数据不丢失,即使部分Broker宕机。
  • 消息回溯:消费者可以通过调整偏移量重新消费历史数据。
  • 流处理能力:与Kafka Streams或Flink等流处理框架无缝集成。

希望这次更正后的、聚焦于Kafka的解析能真正帮助到您!对于之前混淆的错误,再次深表歉意。如果还有任何不清楚的地方,请随时提出。

http://www.jsqmd.com/news/658758/

相关文章:

  • 基于EOF分析的PDO指数计算与Python实践指南
  • 简单理解:MTK(联发科)、中兴微(中兴微电子)、ASR(翱捷科技)
  • [Simulink实战] 基于STM32的永磁同步电机无传感FOC控制:从模型到代码的完整开发流程
  • 炉石传说HsMod插件:55项功能深度解析与架构实现
  • Joy-Con Toolkit深度解析:开源手柄控制技术的架构与实现
  • 时序抖动:概念、测量与系统设计优化
  • 保姆级避坑指南:Ubuntu 20.04 LTS源码编译Qt 5.15.2全流程
  • 学Simulink——基于Simulink的AUTOSAR架构下电机控制软件组件建模
  • 5分钟快速上手!Umi-OCR免费离线文字识别工具终极指南
  • 图像处理 | 从原理到实战:一网打尽经典边缘检测算子(Roberts, Sobel, Prewitt, Canny)及其Python实现
  • Python调试神器:Pdb命令速查手册
  • python pre-commit-hooks
  • 数字政府智慧政务场景落地AI大模型基于DeepSeek实操应用设计方案:核心应用场景落地设计、实施保障与运维体系
  • 跨平台Gitea数据迁移实战指南
  • 从零到一:在Ubuntu上搭建完整的GNU Radio Python开发环境
  • 2026年评价高的唐山断桥铝阳光房/唐山铝包木阳光房稳定供货厂家推荐 - 品牌宣传支持者
  • python commitizen
  • 别再为K8s存储发愁了!手把手教你用Ceph RBD搞定持久化卷(附Pod调度避坑指南)
  • 5分钟掌握PlantUML Editor:专业级代码驱动UML绘图工具实战指南
  • ARINC 429协议解析:航空电子数据总线的核心原理与应用
  • C语言学习路线:从入门到精通,打好编程内功【大一必看】
  • MedGemma Medical Vision Lab效果展示:病理切片WSI低倍镜下肿瘤区域与淋巴细胞浸润密度文本评估
  • python python-semantic-release
  • 免费在线UML绘图神器:3分钟学会用代码生成专业图表
  • 【优化求解】基于matlab不同发动机和燃料对GA应用进行价格调整建模【含Matlab源码 15342期】
  • 铁路基础设施缺陷盲道防撞柱井盖缺陷道路设施检测数据集VOC+YOLO格式2039张13类别
  • GSV9001E@ACP# 参数规格 + 产品特色总结分享
  • 别再只会用nmap了!Vim映射模式全解析:nmap、vmap、imap到底啥区别?
  • Mac上pip install总报‘site-packages is not writeable’?别慌,这其实是苹果在保护你的系统
  • 科研绘图进阶:PPT与MATLAB矢量图无损导入Word的终极指南