java面试:有了解过kafka架构吗,可以详细讲一讲吗

kafka是一个消息队列的常见架构,负责对消息的传递和管理,进而来保证服务的上下游具有一个相对较好的性能,因此在java的面试当中,kafka常常会最为一个考察要点来判断面试者对mq消息队列的熟悉程度,因此今天我们就对kafka消息队列进行分享和讲解,希望大家能从中学习到知识,能够有所收获。

1.kafka的整体架构

与上一期讲解的mq设计的逻辑核心类似,kafak消息队列的构成的过程当中是包含发送信息数据的生产者,用于处理生产者信息和接受处理消费者拉取请求的borker,管理broker的ZK注册中心,以及获得数据的消费者,具体结构如下图所示:

2.kafka当中的topic

从消息的角度来说,消息事实上是具有许多的类型的,为了方便消息的管理,所以broker通过topic来对消息进行分类,这样生产者就可以将不同类型的消息发送到对应的topic上,而消费者也可以通过订阅不同的topic来获取收集消息。

同时我们也知道同一条消息是可以被多个消费者消费的,但是这么多不同的消费者,我们是需要记录这些消费的的消费进度的,所以在toopic当中的每条消息实则还做了partition的分区,而每一条信息被称之为offset,消费者只要在读取使用数据的过程中记录保存对应的offset接可以了。

broker中topic的分区

分区写入消费的逻辑

3.kafka的高可用

假设一个topic的partition是整体的被存储在某一个机器上的,那这个机器的io就成为了这个topic的性能瓶颈,这样的效率和可用性会不太高,为了解决这种问题,topic下的partition被分为了多段,而每一段的partition只存储部分信息,而broker是集群,因此一个topic下的多个partition就可以被分散到不同的broker节点当中,这样我们单机存储的性能问题就被解决了。

不过依旧会存在一定的问题,首先就是虽然说消息被分散了出去,但kafka就只能保证单个partition队列中的消息是有序的,而同一个topic下的partition切片的有序性就无法保证了。

而其次就是,假设broker故障宕机了就会导致其所存储的部分partition数据就丢失了,这样的结果就是消息的完整性就相对较差了

为了解决这个问题,kafka提供了一个多副本机制,每个parttition数据都会同步到其他的broker节点当中,而这些broker节点就相当与partition的副本,而这些节点回选取一个leader节点去和生产者和消费者进行交互,获取到请求后,kafka就会将数据同步给其他的所有副本,同时这个推选出来的leader节点,就会包含所有的读写操作,来方便管理用户的消费进度,而假设读取的是副节点的数据,offset就较为难管理了。

4.kafka的消费者组的概念

为了能够及时的将数据消费掉,因此kafak增加了消费者组的概念,多个消费者组成消费者组,而这些消费者组就能够并行的对消息进行消费。

5.kafka的工作流程

为了保证工作流程顺利进行,kafka需要保证生产者要发送信息到哪个broker中,而消费者需要从那个broker中获取信息,因此kafak当中的broker集群会定时的向zk注册中心发送心跳包,这样zk就掌管了所有broker的topic和partition的信息,而broker会选举一个管理者叫controller,controller会持续监听zk当中的数据,当发现zk的topic数据发生变化时,controller就会拉取最新的消息,广播给每个broker,因此broker本省就有所有的集群信息和路由表。

生产者访问broker就能获取到路由信息,将消息发送给对应topic的partiton的leader的broker,而broker收到消息就会写到partiton的末尾,分配offset,然后同步数据构建partition副本。

消费者通过访问borker就可以获得订阅信息和路由信息,就知道去哪个broker中去拉取信息了,然后通过offset去读取对应节点的消息。

今天的分享就到这里了,希望这篇博客能给你一些帮助,让你对关于kafka架构的问题得到进一步的提升,在面试的时候能从容面对面试官。

相关推荐
sakoba3 小时前
Linux上kafka部署和使用
linux·运维·kafka
一行•坚书3 小时前
kafka服务端与客户端如何协作?生产者发送消息分区策略是什么?消费者组分区策略?集群与ACK机制?
java·后端·kafka
HalukiSan3 小时前
多线程异常、MQ、Kafka(八股)
面试·kafka
T___T3 小时前
从代码到页面:HTML/CSS/JS 渲染全解析
前端·面试
serve the people3 小时前
Prompt Composition with LangChain’s PipelinePromptTemplate
java·langchain·prompt
天天摸鱼的java工程师3 小时前
干掉系统卡顿!Excel异步导出完整实战方案(百万数据也不慌)
java·后端
心随雨下3 小时前
Java中将System.out内容写入Tomcat日志
java·开发语言·tomcat
-指短琴长-4 小时前
ProtoBuf速成【基于C++讲解】
android·java·c++
Cx330❀4 小时前
《C++ 搜索二叉树》深入理解 C++ 搜索二叉树:特性、实现与应用
java·开发语言·数据结构·c++·算法·面试