kafka入门和核心概念介绍

kafka入门和核心概念介绍

我们先从 Kafka 的基础模型说起。简单来看,Kafka 扮演着 "消息中转站" 的角色:生产者(producer)将消息发送到 Kafka,消费者(consumer)再从 Kafka 中获取消息进行处理,Kafka 就是连接两者的中间消息队列。

但 Kafka 的核心是发布 - 订阅模型 ,而非简单的队列。具体来说,生产者会将消息发送到特定的 "主题(topic)" 中,消费者则从主题中消费数据。它与普通队列的关键区别在于:多个消费者可以同时订阅同一个主题,这意味着同一条消息能被多个消费者分别处理。

举个实际场景的例子:电商公司会将用户的行为数据(如点击、加购等)发送到 Kafka 的某个主题中,此时行为监测模块需要分析用户行为轨迹,商品推荐模块需要基于行为数据生成推荐,这两个模块就可以作为不同的消费者,同时从该主题中获取消息,各自完成业务处理。

要进一步理解 Kafka 的高可用性,需要先明确几个核心概念 ------ 这些概念的引入,本质是将 Kafka 的单个节点扩展为多节点集群,提升系统的可靠性和效率:

  1. 代理(broker) 可以简单理解为一个独立的 Kafka 服务实例,每个 broker 内部包含多个主题(topic),多个 broker 共同组成 Kafka 集群。

  2. 分区(partition) 主题(topic)是生产者和消费者指定的 "外层标识",其内部由多个分区组成。例如,一个主题包含 2 个分区时,若生产者发送 100 条消息,理想情况下每个分区会各存储 50 条(实际分配可能受消息键值影响,但此处简化理解)。分区的作用是实现消息的 "分片存储",为后续并发处理奠定基础。

  3. 消费者组(consumer group) 发布 - 订阅模型中的 "消费者" 实际以 "消费者组" 为单位工作:一个消费者组由多个消费者组成,可共同并发消费某个主题的消息。 这里的关键逻辑是:一个消费者可负责消费一个或多个分区,但一个分区只能被同一个消费者组内的一个消费者消费。这意味着若主题有 2 个分区,而消费者组有 3 个消费者,就会有 1 个消费者处于空闲状态。因此,配置时通常需要保证 "主题的分区数 ≥ 消费者组内的消费者数",以充分利用并发能力。

  4. 副本(Replica) 副本是分区的 "备份",用于保证数据可靠性。例如,副本数为 3 时,一个分区的数据会有 3 份(如分区 1 的副本 1-1、1-2、1-3),且这 3 份数据完全一致。

    • 副本中会选举出一个 "leader"(如 1-1),其余为 "follower"(如 1-2、1-3)。生产者发送消息时,只会将数据写入 leader,follower 则后台同步 leader 的数据。
    • 消息写入的确认机制由参数acks控制:acks=0表示消息发送后立即认为成功(不等待确认);acks=1表示仅 leader 写入成功即返回;acks=all表示需要 leader 和所有 "ISR(已同步副本集合)" 中的 follower 都写入成功才返回。
    • ISR 是指与 leader 保持 "高度同步" 的副本集合(包含 leader 自身和健康的 follower)。Kafka 通过replica.lag.time.max.ms参数判断 follower 是否健康:若 follower 同步滞后时间超过该阈值,会被移出 ISR。
    • 消费者仅从 leader 消费消息,消费完成后会提交一个 "offset"(消息偏移量)给 leader,由 leader 管理;follower 不参与消费过程,仅负责数据同步。(注:副本的选举与管理涉及 Kraft 算法,本文暂不展开,感兴趣可进一步了解。)

最后,我们看看多 broker 集群中,分区和副本是如何存储的。 假设存在 10 个 broker、5 个主题,每个主题包含 10 个分区,副本数为 3:

  • 总副本数为:5(主题)×10(分区 / 主题)×3(副本 / 分区)=150 个;
  • 平均到 10 个 broker 上,每个 broker 会存储 150÷10=15 个副本。

若没有副本(即副本数 = 1),总分区数为 5×10=50 个,显然 15<50,这说明每个 broker 只会存储部分分区的副本,而非全部数据。 这种设计体现了 "分治思想":整个集群通过多个 broker 分担存储和处理压力,既保证了数据的分布式存储,又提升了系统的容错能力和扩展性。


图片来源:

Javaguide:javaguide.cn/high-perfor...

利志分享:微信公众号

相关推荐
2401_895521343 小时前
SpringBoot Maven快速上手
spring boot·后端·maven
disgare3 小时前
关于 spring 工程中添加 traceID 实践
java·后端·spring
ictI CABL3 小时前
Spring Boot与MyBatis
spring boot·后端·mybatis
小江的记录本5 小时前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
yhole8 小时前
springboot三层架构详细讲解
spring boot·后端·架构
香香甜甜的辣椒炒肉8 小时前
Spring(1)基本概念+开发的基本步骤
java·后端·spring
白毛大侠9 小时前
Go Goroutine 与用户态是进程级
开发语言·后端·golang
ForteScarlet9 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·开发语言·后端·ios·开源·kotlin
大阿明9 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
Binary-Jeff10 小时前
Spring 创建 Bean 的关键流程
java·开发语言·前端·spring boot·后端·spring·学习方法