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...

利志分享:微信公众号

相关推荐
ankleless2 分钟前
Spring Boot 实战:从项目搭建到部署优化
java·spring boot·后端
百锦再30 分钟前
一文精通 Swagger 在 .NET 中的全方位配置与应用
后端·ui·.net·接口·配置·swagger·访问
用户48221371677536 分钟前
C++——静态数组、动态数组
后端
用户48221371677543 分钟前
C++—— String 类详解
后端
BothSavage1 小时前
Java获取被nginx代理的emqx客户端真实ip
后端
David爱编程2 小时前
为什么线程不是越多越好?一文讲透上下文切换成本
java·后端
诗人啊_程序员2 小时前
Flask 路由与视图函数绑定机制
后端·python·flask
bcbnb2 小时前
移动端网页调试实战 IndexedDB 与本地存储问题的排查与优化
后端
csxin2 小时前
Spring Boot 中如何设置 serializer 的 TimeZone
java·后端
荔枝爱编程2 小时前
如何在 Docker 容器中使用 Arthas 监控 Java 应用
java·后端·docker