Kafka 基础概念
Kafka 是什么?
分布式流处理平台,专为高吞吐量、低延迟的实时数据流设计。核心功能包括发布-订阅消息系统、持久化存储和流式处理。
核心组件
- Topic:消息的逻辑分类,类似数据库表。
- Partition:Topic 的物理分片,支持并行处理和分布式存储。
- Broker:集群中的单个节点,负责存储和转发消息。
- Producer:向 Topic 发布消息的客户端。
- Consumer:从 Topic 订阅消息的客户端。
- Consumer Group:一组协同消费同一 Topic 的 Consumer,确保每条消息仅被组内一个 Consumer 处理。
消息存储机制
消息以 Partition 为单位持久化到磁盘,每个 Partition 由多个 Segment 文件组成(含.log和.index文件)。消息顺序追加,索引文件加速检索。
应用场景
何时选择 Kafka?
- 需要高吞吐(如日志收集、实时指标分析)。
- 要求水平扩展(如分布式系统间的数据管道)。
- 对比 RabbitMQ:Kafka 适合大数据量、低延迟;RabbitMQ 适合复杂路由和协议支持。
实时数据处理示例
电商用户行为追踪:Producer 发送点击/购买事件到 Kafka,Flink 消费数据并实时计算推荐结果。
消息可靠性
防丢失策略
- 生产者:设置
acks=all确保 Leader 和 ISR 副本写入;启用重试。 - Broker:配置
replication.factor≥2;调整min.insync.replicas。 - 消费者:手动提交偏移量(
enable.auto.commit=false)。
生产者失败处理
自动重试(通过retries和retry.backoff.ms参数控制),需注意消息幂等性。
性能优化
提高吞吐量
- 增加 Partition 数量提升并行度。
- 生产者:批量发送(
batch.size)、压缩消息(compression.type)。 - 消费者:调整
fetch.min.bytes减少拉取次数。
磁盘 I/O 优化
- 使用 SSD 或 RAID 提升磁盘性能。
- 分散 Broker 日志目录到不同磁盘(
log.dirs)。 - 调整刷盘策略(如
log.flush.interval.messages)。
集群管理
监控与维护
- 工具:JMX + Prometheus + Grafana 监控吞吐、延迟、磁盘使用率。
- 维护:定期清理过期日志(
log.retention.hours)、平衡 Partition 分布。
Broker 故障处理
- Leader 副本自动选举(从 ISR 中选择)。
- 确保
unclean.leader.election.enable=false避免数据不一致。
高级特性
幂等性与事务
- 幂等性:防止生产者重复消息(
enable.idempotence=true)。 - 事务:跨 Topic/Partition 的原子写入(需配置
transactional.id)。
分区分配策略
- RangeAssignor:按分区范围分配,易导致负载不均。
- RoundRobin:轮询分配,均衡但重平衡开销大。
- StickyAssignor:减少重平衡时的分区迁移。
Kafka Connect vs. Kafka Streams
- Connect:数据导入/导出工具(如数据库到 Kafka)。
- Streams:客户端流处理库(如实时聚合、过滤)。
面试问题示例
- Kafka 如何保证消息顺序性?
- 解释 ISR 机制及其在故障恢复中的作用。
- 如何设计 Kafka 集群以实现高可用?
- 消费者重复消费的可能原因及解决方案。
- 对比 Kafka 与其他消息队列的优缺点。