作者:码哥字节
kafka 是一个优秀的分布式消息中间件,许多系统中都会使用到 Kafka 来做消息通信。对分布式消息系统的了解和使用几乎成为一个后台开发人员必备的技能。今天码哥字节
就从常见的 Kafka 面试题入手,和大家聊聊 Kafka 的那些事儿。
讲一讲分布式消息中间件
问题
- 什么是分布式消息中间件?
- 消息中间件的作用是什么?
- 消息中间件的使用场景是什么?
- 消息中间件选型?
分布式消息是一种通信机制,和 RPC、HTTP、RMI 等不一样,消息中间件采用分布式中间代理的方式进行通信。如图所示,采用了消息中间件之后,上游业务系统发送消息,先存储在消息中间件,然后由消息中间件将消息分发到对应的业务模块应用(分布式生产者 - 消费者模式)。这种异步的方式,减少了服务之间的耦合程度。
定义消息中间件:
- 利用高效可靠的消息传递机制进行平台无关的数据交流
- 基于数据通信,来进行分布式系统的集成
- 通过提供消息传递和消息排队模型,可以在分布式环境下扩展进程间的通信
在系统架构中引用额外的组件,必然提高系统的架构复杂度和运维的难度,那么在系统中使用分布式消息中间件有什么优势呢?消息中间件在系统中起的作用又是什么呢?
- 解耦
- 冗余(存储)
- 扩展性
- 削峰
- 可恢复性
- 顺序保证
- 缓冲
- 异步通信
面试时,面试官经常会关心面试者对开源组件的选型能力,这既可以考验面试者知识的广度,也可以考验面试者对某类系统的知识的认识深度,而且也可以看出面试者对系统整体把握和系统架构设计的能力。开源分布式消息系统有很多,不同的消息系统的特性也不一样,选择怎样的消息系统,不仅需要对各消息系统有一定的了解,也需要对自身系统需求有清晰的认识。
下面是常见的几种分布式消息系统的对比:
答案关键字
- 什么是分布式消息中间件?通信,队列,分布式,生产消费者模式。
- 消息中间件的作用是什么? 解耦、峰值处理、异步通信、缓冲。
- 消息中间件的使用场景是什么? 异步通信,消息存储处理。
- 消息中间件选型?语言,协议、HA、数据可靠性、性能、事务、生态、简易、推拉模式。
Kafka 基本概念和架构
问题
- 简单讲下 Kafka 的架构?
- Kafka 是推模式还是拉模式,推拉的区别是什么?
- Kafka 如何广播消息?
- Kafka 的消息是否是有序的?
- Kafka 是否支持读写分离?
- Kafka 如何保证数据高可用?
- Kafka 中 zookeeper 的作用?
- 是否支持事务?
- 分区数是否可以减少?
Kafka 架构中的一般概念:
- Producer:生产者,也就是发送消息的一方。生产者负责创建消息,然后将其发送到 Kafka。
- Consumer:消费者,也就是接受消息的一方。消费者连接到 Kafka 上并接收消息,进而进行相应的业务逻辑处理。
- Consumer Group:一个消费者组可以包含一个或多个消费者。使用多分区 + 多消费者方式可以极大提高数据下游的处理速度,同一消费组中的消费者不会重复消费消息,同样的,不同消费组中的消费者消息消息时互不影响。Kafka 就是通过消费组的方式来实现消息 P2P 模式和广播模式。
- Broker:服务代理节点。Broker 是 Kafka 的服务节点,即 Kafka 的服务器。
- Topic:Kafka 中的消息以 Topic 为单位进行划分,生产者将消息发送到特定的 Topic,而消费者负责订阅 Topic 的消息并进行消费。
- Partition:Topic 是一个逻辑的概念,它可以细分为多个分区,每个分区只属于单个主题。同一个主题下不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志(Log)文件,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量(offset)。
- Offset:offset 是消息在分区中的唯一标识,Kafka 通过它来保证消息在分区内的顺序性,不过 offset 并不跨越分区,也就是说,Kafka 保证的是分区有序性而不是主题有序性。
- Replication:副本,是 Kafka 保证数据高可用的方式,Kafka 同一 Partition 的数据可以在多 Broker 上存在多个副本,通常只有主副本对外提供读写服务,当主副本所在 broker 崩溃或发生网络一场,Kafka 会在 Controller 的管理下会重新选择新的 Leader 副本对外提供读写服务。
- Record: 实际写入 Kafka 中并可以被读取的消息记录。每个 record 包含了 key、value 和 timestamp。
Kafka Topic Partitions Layout