【面试】Kafka基础知识

定义

Kafka是一个分布式基于发布/订阅模式的消息队列

优点

  • 解耦:上下游之间依赖解耦。
  • 缓冲/削峰:生产消息的速度和消费消息的速度不一致时,可以起到缓冲作用。
  • 异步:天然的异步处理机制,生产者把消息(任务)放进队列,消费者把消息(任务)从队列中拿出。

关键名词

  • 生产者(Producer):消息生产者,负责给Kafka Broker发消息。
  • 消费者(Consumer):消息消费者,负责从Kafka Broker中取消息。
  • 消费者组(Consumer Group, CG):消费者组,由多个消费者组成。
  • 代理者(Broker):Kafka集群中的服务器。
  • 主题(Topic):生产者和消费者面向的队列。
  • 分区(Partition):Topic分布在多个Broker中,Topic分为多个Partition,每个Partition自己是有序的队列。
  • 消息位移(Consumer Offset):代表消费者当前消费的进度,每个消费者会维护自己的消费者唯一。
  • 副本(Replica):
    • 提高可靠性和容错能力:Kafka副本可以提高数据的可靠性和容错能力。如果某个Broker宕机,Leader副本失效,此时Follower副本会自动切换为Leader副本,确保数据的可靠性和服务的可用性。
    • 提高读取性能:Kafka读取速度非常快,部分原因是因为副本机制的支持。读取请求可以被分发到多个副本中,从而提高读取性能。
    • 提高吞吐量:Kafka可以在多个Broker之间进行数据分片,支持并行处理,从而提高吞吐量。同时,副本机制也支持并行处理,提高了吞吐量。
    • 支持数据的备份和恢复:Kafka副本机制可以支持数据备份和恢复。
  • 重平衡(Rebalance):当消费者组增加或者减少消费者的时候,其他消费者实例重新分配订阅主题分区的过程,Rebalance也是Kafka确保高可用的手段之一。

核心API

  • 生产者API:面向生产者的API,简单理解为生产者通过调用该API方法发送(发布)消息
  • 消费者API:面向消费者的API,简单理解为消费者通过调用该API方法获取(订阅)消息
  • Streams API:在一下流处理场景可以使用的API
  • Connector API:

应用场景

  • 上下游数据同步
  • 日志收集

常见面试问题

Kafka是如何保证每个消费者不多消费也不少消费?

Kafka 使用的是一种叫做 "分区 rebalance" 的机制来保证每个消费者不会多消费或少消费。具体来说,每个 Kafka 主题都会分为多个不同的分区,每个消费者在加入组时会被分配到一个或多个分区。当消费者加入组时,Kafka 会为每个消费者分配一定数量的分区。如果一个消费者失败或离开组,Kafka 会重新分配其分区给其他消费者。这就是所谓的 "分区 Rebalance",可以保证每个消费者都只消费自己被分配的分区。此外,Kafka 还会跟踪每个消费者消费的偏移量,以确保每个消费者都从正确的位置开始读取消息。这可以通过 Kafka 的消费者组协议来实现,例如,基于偏移量提交和跟踪来确保每个消费者消费正确的偏移量。

可参考知乎:Kafka如何保证不丢失不重复消费 - 知乎

Kafka实现高可用的方法?

  1. 分布式:Kafka集群是由多个Broker组成的,通常这些Broker会分布在不同的机器上。这种分散布置的好处是当集群中的某台机器出现故障时,其他机器上的Broker仍然能够提供服务,确保了系统的高可用性。
  2. 备份机制:其实思路很简单,就是将相同的数据拷贝到多台机子上,副本分为Leader Replica(主副本)和Follower Replica(从副本),Leader Replica对外提供服务,Follower Replica追随Leader Replica,并不对外提供服务。生产者向Leader Replica写消息,消费者从Leader Replica读消息,而Follower Replica主动向Leader Replica发请求让Leader Replica将最新的数据发送给他,Follower Replica接收到后进行持久化,Follower Replica唯一需要做的就是与Leader Replica保持同步,当Leader Replica数据出现问题时,Follower Replica可以顶上。
  3. 重平衡:当消费者组增加或者减少消费者的时候,其他消费者实例重新分配订阅主题分区的过程。

Kafka Broker是如何持久化数据的?

Kafka使用消息日志(Log)来存储数据,并且通过日志段机制(Log Segment)将日志细分成多个日志段,新的消息会被追加到最新的日志段中,如果当前日志段写满,则会自动切分初一个新的日志段,并且将辽的日志段保存。Kafka还有定时任务定期定理老的日志段。

相关推荐
Stringzhua17 分钟前
【SpringCloud】Kafka消息中间件
spring·spring cloud·kafka
测试199842 分钟前
2024软件测试面试热点问题
自动化测试·软件测试·python·测试工具·面试·职场和发展·压力测试
马剑威(威哥爱编程)1 小时前
MongoDB面试专题33道解析
数据库·mongodb·面试
独行soc4 小时前
#渗透测试#SRC漏洞挖掘#深入挖掘XSS漏洞02之测试流程
web安全·面试·渗透测试·xss·漏洞挖掘·1024程序员节
理想不理想v4 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
sszmvb12345 小时前
测试开发 | 电商业务性能测试: Jmeter 参数化功能实现注册登录的数据驱动
jmeter·面试·职场和发展
测试杂货铺5 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
王佑辉5 小时前
【redis】redis缓存和数据库保证一致性的方案
redis·面试
真忒修斯之船5 小时前
大模型分布式训练并行技术(三)流水线并行
面试·llm·aigc
ZL不懂前端5 小时前
Content Security Policy (CSP)
前端·javascript·面试