【第三章:服务端通用工具】第17节:消息队列 - Kafka介绍
大家好,上一节我们对Redis进行了学习,本小节中我们主要对消息队列Kafka进行简单的学习与介绍。消息队列也是服务端的通用工具之一,在众多的场景中都有使用。消息队列的了解与掌握是面试中的一大加分项。
(1)消息队列Kafka有了解吗?
答:Kafka是一个消息队列,可以实现发布订阅模式,在异步通信或者生产者和消费者需要解耦合的场景中经常使用,可以对数据流进行处理等。
Kafka的特性如下所示:
- Kafka支持消息的快速持久化
- 支持批量读写消息
- 支持消息分区,并且支持在线增加分区,提高了并发能力
- 支持为每个分区创建多个副本
Kafka可以实现消息的快速持久化的原因:
- KafKa将消息保存在磁盘中,并且读写磁盘的方式是顺序读写,避免了随机读写磁盘(寻道时间过长)导致的性能瓶颈。
- 磁盘的顺序读写速度超过内存随机读写。
解析:
这道题目是Kafka相关知识点的基础题目。如果我们的简历中写了对Kafka有一定的了解与掌握或者面试的岗位对消息队列有一定的了解,那么肯定会受到来自灵魂的拷问。
读到这里,聪明的读者可能会有疑问了。Kafka使用磁盘进行数据的持久化,那么如何保证高性能呢?我们都知道磁盘的操作一般情况下是远远低于对内存的操作效率的。
Kafka使用磁盘存储,为什么会具有高性能的特点?
- 顺序读写磁盘:
消息在磁盘中的方式是顺序读写的,磁盘的顺序读写速度超过内存随机读写。
- 页缓存:
页缓存是操作系统实现的一种主要的磁盘缓存,以此用来减少对磁盘I/O 的操作。具体就是把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问。当然,也会存在磁盘脏页,以及合适时机会进行刷盘操作。
- 零拷贝:
使用零拷贝( Zero-Copy )技术来进一步提升Kafka性能。零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换
(2)Kafka中的核心概念:
答: 核心概念如下所示:
- 生产者(Producer):
生产消息,并且按照一定的规则(分区分配规则)推送到Topic的分区中。
- 消费者(Consumer):
从Topic中拉取消息并且进行消费,消费者自行维护消费消息的位置(offset)。
- 主题(Topic):
存储消息的逻辑概念,是一个消息集合,Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic。
- 分区(partition):
每个Topic可以划分为多个分区,每个消息在分区中都会有一个唯一编号offset,kafka通过offset保证消息在分区中的顺序,同一Topic的不同分区可以分配在不同的Broker上,partition以文件的形式存储在文件系统中。
- 副本(replica):
KafKa对消息进行了冗余备份,每个分区有多个副本,每个副本中包含的消息是“一样”的。每个副本中都会选举出一个Leader副本,其余为Follower副本,Follower副本仅仅是将数据从Leader副本拉到本地,然后同步到自己的Log中。
- 消费者组(Consumer Group):
每个consumer都属于一个consumer group,每条消息只能被consumer group中的一个Consumer消费,但可以被多个consumer group消费。
- Broker:
一个单独的server就是一个Broker,主要用来接收生产者发过来的消息,分配offset,并且保存到磁盘中。
- Cluster & Controller:
多个Broker可以组成一个Cluster集群,每个集群选举一个Broker来作为Controller,充当指挥中心。Controller负责管理分区的状态,管理每个分区的副本状态,监听ZooKeeper中数据的变化等工作。
- 日志压缩与保留策略:
不管消费者是否已经消费了消息,Kafka都会保存这些消息(持久化到磁盘),通过配置相应的保留策略,定时删除陈旧的消息。所谓日志压缩,就是定时进行相同key值得合并,只保留最新的Key-Value值。
(3)简单介绍下Kafka中的副本机制吧。
答:在上边核心概念的介绍中,我们提到了使用副本机制来进行冗余备份,这里我们继续介绍副本机制的相关知识点。
在分布式的存储中,进行冗余备份是一种常见的设计,主要的设计方案有同步复制和异步复制。
同步复制:
当所有的Follower副本都将消息复制完成,这条消息才会被认为是提交完成,一旦有一个Follower副本出现故障,就会导致消息无法提交,极大的影响到了系统的性能。
异步复制:
当Leader副本接收到生产者发送的消息后就认为当前消息提交成功。Follower副本异步的从Leader副本同步消息,但是不可以保证同步速度,当Leader副本突然宕机的时候,可能Follower副本中的消息落后太多,导致消息的丢失。
考虑到同步复制和异步复制的优缺点,Kafka引入了ISR集合。
ISR(In-Sync-Replica)集合:
可用副本集合,ISR集合表示当前“可用”且消息量与Leader相差不多的副本集合,需要满足如下条件:
- 副本所在节点必须维持着与ZooKeeper的连接。
- 副本最后一条信息的offset与Leader副本的最后一条消息的offset之间的差值不能超过指定的阈值。
HW和LEO标志:
- HW(HighWatermark)表示高水位,标记了一个特殊的offset,当消费者处理消息的时候,只能拉取到HW之前的消息。HW也是由Leader副本管理的。
- LEO(Log End Offset)是所有副本都会有的一个offset标记。
ISR、HW和LEO的工作配合机制:
- producer向此分区中推送消息
- Leader副本将消息追加到Log中,并且递增其LEO
- Follower副本从Leader副本中拉取消息进行同步
- Follower副本将消息更新到本地Log中,并且递增其LEO
- 当ISR集合中的所有副本都完成了对offset的消息同步,Leader副本会递增其HW
优势:
- 同步复制会导致高延迟,异步复制可能会造成消息的丢失。
- KafKa引入的ISR集合解决了同步复制和异步复制的缺点。
- 当Follower副本延迟过高时,将会被踢出ISR集合,避免了高延迟的Follower副本影响整个KafKa集群性能。
- 当Leader副本所在的Broker宕机,会优先将ISR集合中的Follower副本选举为Leader。
学习到这里,我们来简单搭建一个Kafka的本地调试环境,看看Kafka的效果吧。
Kafka本地调试环境
首先我们需要下载安装包:kafka_2.9.2-0.8.
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> Java开发岗高频面试题全解析,专刊正文共计31节,已经全部更新完毕。专刊分9个模块来对Java岗位面试中的知识点进行解析,包括通用面试技能,Java基础,Java进阶,网络协议,常见框架以及算法,设计模式等。专刊串点成面的解析每个面试题背后的技术原理,由浅入深,循序渐进,力争让大家掌握面试题目的背后的技术原理,摒弃背题模式的陋习。 专刊详细信息,请查阅专刊大纲和开篇词的介绍。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>
