目录
1.Kafka中的ISR(InSyncRepli)、OSR(OutSyncRepli)、AR(AllRepli)代表什么?
5.“消费组中的消费者个数如果超过topic的分区,那么就会有消费者消费不到数据”这句话是否正确?
10.topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?
16.Kafka中有那些地方需要选举?这些地方的选举策略又有哪些?
19.Kafka创建Topic时如何将分区放置到不同的Broker中?
21.Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?
22.Kafka生产者客户端的整体结构是什么样子的?使用了几个线程来处理?分别是什么?
23.消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1?
这份面试题是根据这篇文章写的,因为是刚学完的Kafka,来看面试题有知识点好一点,所以就写了这篇文章。Kafka常见面试题(附个人解读答案+持续更新)_消费组中的消费者个数如果超过topic的分区,那么就会有消费者消费不到数据-CSDN博客
然后我学Kafka是看的这篇文章,很不错的。
看完这篇Kafka,你也许就会了Kafka-CSDN博客
题库
1.Kafka中的ISR(InSyncRepli)、OSR(OutSyncRepli)、AR(AllRepli)代表什么?
AR(All Replicas)- 全部副本:AR 是主题分区(Topic Partition)的所有副本的集合。对于一个给定的主题分区,无论这些副本是否处于同步状态,只要是该分区的副本,都属于 AR。例如,在一个 Kafka 集群中,创建一个主题有 3 个副本,那么这 3 个副本就构成了该主题分区的 AR。
ISR(In - Sync Replicas)- 同步副本集合:ISR 是 AR 的一个子集,包含了那些与领导者副本(Leader Replica)保持同步的副本。这些副本能够及时地获取并应用来自领导者副本的最新消息。判断一个副本是否在 ISR 中,通常基于副本与领导者副本的滞后程度(通过一些参数来衡量,如时间延迟或消息数量的差异)。例如,在 Kafka 中,如果一个副本落后领导者副本的消息数量不超过某个配置的阈值(如replica.lag.max.messages
),并且在一定时间范围内(如replica.lag.time.max.ms
)能够跟上领导者副本的进度,那么这个副本就在 ISR 中。
用途:ISR 中的副本可以在领导者副本不可用时,快速地接替领导者角色,保证消息的可用性和一致性。因为这些副本与领导者副本的数据基本是同步的,所以它们能够提供可靠的数据服务。
OSR(Out - Sync Replicas)- 不同步副本集合:OSR 是 AR 中除去 ISR 后的剩余副本集合,即那些与领导者副本不同步的副本。这些副本可能由于网络问题、节点负载过高或者其他原因,无法及时跟上领导者副本的消息更新。例如,如果一个副本由于网络拥塞,长时间无法获取领导者副本发送的消息,导致其落后太多,那么这个副本就会被移到 OSR 中。
用途:OSR 中的副本通常不能直接参与消息的读写服务。它们需要努力追赶领导者副本的进度,当满足与领导者副本同步的条件后,才有可能重新进入 ISR。在监控和维护 Kafka 集群时,OSR 的大小和其中副本的状态可以帮助管理员发现集群中可能存在的问题,如网络瓶颈、节点性能问题等。
2.Kafka中的HW、LEO等分别代表什么?
LEO(Log End Offset)- 日志末端偏移量:LEO 是每个副本(Replica)独有的概念。它表示该副本的日志(Log)中最后一条消息的下一个偏移量(Offset)。LEO 是一个动态变化的值,随着新消息不断写入副本而不断增加。对于生产者(Producer)来说,当它向 Kafka 主题分区(Topic Partition)的领导者副本(Leader Replica)发送消息成功后,领导者副本的 LEO 就会更新。
用途:用于跟踪副本的数据写入进度。在 Kafka 的内部机制中,了解每个副本的 LEO 有助于协调生产者和消费者之间的操作。例如,生产者可以根据领导者副本的 LEO 来判断是否可以继续发送消息,避免消息发送过多导致存储溢出。
对于副本之间的同步也非常重要。追随者副本(Follower Replica)会根据领导者副本的 LEO 来确定自己需要同步的数据范围,从而保持与领导者副本的数据一致性。
HW(High Watermark)- 高水位线:HW 的值等于 ISR(In - Sync Replicas)集合中所有副本的最小 LEO。它是消费者(Consumer)可见的最大偏移量(Offset)。
用途:保证消息的一致性和顺序性。消费者只能看到偏移量小于等于 HW 的消息,这意味着消费者不会读取到尚未完全同步到所有同步副本中的消息。这样可以防止消费者读取到可能会丢失的数据,因为这些数据还没有被所有副本安全地保存。
用于数据复制和恢复。在副本同步过程中,追随者副本会努力将自己的日志复制到与 HW 相同的位置,以确保数据的一致性。如果一个副本落后于 HW,它会通过从领导者副本或其他同步副本那里获取消息来追赶进度。在发生故障恢复时,HW 也为恢复过程提供了一个重要的参考点,确保新的领导者副本能够从一个安全的位置开始提供服务。
3.Kafka的用途有哪些?使用场景如何?
消息队列用途:
异步处理:将消息发送到消息队列,让业务系统从消息队列中拉取消息,不会影响业务的进行。例如,在电商系统中,用户下单后,订单处理系统可以将订单信息发送到 Kafka。支付系统、库存系统和物流系统作为消费者可以从 Kafka 中获取订单信息进行处理。这些系统不需要同步等待彼此完成操作,而是可以异步地从 Kafka 中获取消息并执行自己的任务,从而提高了系统的整体响应速度。
流量削峰:在高流量场景下,Kafka 可以缓冲大量的消息。例如,在电商促销活动期间,大量用户会同时下单,订单生成系统可以将订单消息发送到 Kafka。消费者系统(如库存系统和支付系统)可以按照自己的处理能力从 Kafka 中获取消息进行处理。这样可以避免短时间内大量请求直接冲击后端服务,防止系统因过载而崩溃。
日志收集用途:
分布式日志收集:kafka 是收集和聚合分布式系统日志的理想工具。在一个由多个微服务组成的分布式系统中,每个微服务可以将自己的日志发送到 Kafka。例如,一个由用户服务、订单服务和支付服务组成的电商系统,各个服务可以将访问日志、错误日志等发送到 Kafka。然后可以有专门的日志处理系统从 Kafka 中获取日志进行存储、分析和监控。
日志持久化和传输:Kafka 可以将日志持久化存储,并且由于其高吞吐量和可靠性,能够保证日志在传输过程中的完整性。日志可以在 Kafka 集群中存储一段时间,以便后续的分析和查询。同时,Kafka 可以将日志传输到其他存储系统,如数据仓库或日志分析工具。
事件驱动架构用途:
构建事件流平台:kafka 可以作为事件驱动架构(EDA)中的核心事件流平台。在这种架构中,系统中的各个组件通过产生和消费事件来进行交互。例如,在一个物联网(IoT)系统中,各种传感器可以将检测到的事件(如温度变化、设备故障等)发送到 Kafka。其他系统(如设备管理系统、报警系统)可以从 Kafka 中获取这些事件并做出相应的反应。
可以实现复杂的事件处理逻辑。通过 Kafka Streams 等工具,可以在 Kafka 的事件流基础上进行过滤、转换、聚合等操作。例如,在金融交易系统中,可以对交易事件进行实时监控和分析,当发现异常交易模式时,可以及时触发警报。
数据集成用途:
系统间数据同步:kafka 可以用于不同系统之间的数据同步。例如,一个企业内部有多个业务系统,如客户关系管理系统(CRM)和企业资源规划系统(ERP),可以通过 Kafka 将客户数据或订单数据从一个系统同步到另一个系统。数据生产者将更新的数据发送到 Kafka,消费者系统从 Kafka 中获取数据并更新自己的数据库。在数据迁移过程中,Kafka 也可以发挥作用。例如,将旧系统的数据迁移到新系统时,可以先将旧系统的数据发送到 Kafka,然后新系统从 Kafka 中获取数据进行导入,这样可以保证数据迁移的平滑性和数据的完整性。
4.Kafka中是怎么体现消息顺序性的?
分区(Partition)机制对消息顺序性的保障:
分区内的顺序性:Kafka 通过分区来存储消息。在每个分区内部,消息是按照发送的先后顺序进行存储的。例如,生产者按照顺序发送消息 M1、M2、M3 到一个分区,那么在这个分区的存储中,消息的顺序也是 M1、M2、M3。当消费者从这个分区读取消息时,只要是按照偏移量(Offset)从小到大的顺序读取,就能保证消息的顺序性。这是因为 Kafka 的存储结构(基于日志文件)和消息写入机制确保了在分区层面消息是有序的。
分区的选择策略与顺序性:生产者在发送消息时可以指定分区,也可以使用默认的分区策略。如果生产者能够根据业务逻辑合理地选择分区,例如,将属于同一业务流程的消息发送到同一个分区,就可以更好地保证消息的顺序性。比如,在一个电商订单处理系统中,将同一个订单的创建、支付、发货等消息都发送到同一个分区,这样消费者在读取这个分区的消息时,就能按照订单处理的正确顺序来处理消息。
5.“消费组中的消费者个数如果超过topic的分区,那么就会有消费者消费不到数据”这句话是否正确?
这句话是正确的。
Kafka 消费组与分区的分配机制:在Kafka 中,消费组(Consumer Group)是多个消费者(Consumer)组成的一个逻辑分组,用于共同消费一个或多个主题(Topic)的数据。分区(Partition)是 Kafka 存储消息的基本单位,每个分区的数据在逻辑上是独立的,并且在一个消费组内,一个分区的数据只能被一个消费者消费。当消费组中的消费者个数超过主题的分区数时,根据 Kafka 的分区分配策略,分区会被尽可能均匀地分配给消费者,实现负载均衡。例如,假设上述主题my_topic
还是 3 个分区,但消费组my_group
中有 5 个消费者。那么,3 个分区的数据会被分配给 3 个消费者,而剩下的 2 个消费者就没有分区可以分配,因此这 2 个消费者就消费不到数据。这种分配方式是为了保证每个分区的数据在消费组内只有一个消费者进行消费,以避免数据的重复消费和混乱。
6. 有哪些情形会造成重复消费?或丢失信息?
重复消费:
先处理后提交offset,会导致重复消费:如果消费者在成功消费消息后,由于网络故障、程序异常等原因导致偏移量提交失败,那么当消费者重新启动或者重新平衡分区时,它可能会从之前已经消费过的位置开始重新消费消息,从而造成重复消费。
触发消息重传机制:生产者发送消息时,如果没有正确收到 Kafka 的确认(ACK)消息,可能会进行消息重传。在某些情况下,Kafka 可能已经成功接收并存储了消息,但由于网络延迟或其他问题,生产者没有收到 ACK。当生产者重传消息时,这些消息就会被重复存储在 Kafka 中,消费者在读取这些消息时就会造成重复消费。
丢失消息:
生产者发送消息没有确认消息是否发送成功会导致消息丢失:当生产者使用 “fire - and - forget”(即发送消息后不等待任何确认)模式发送消息时,如果 Kafka 集群出现问题(如代理(Broker)崩溃、网络故障等)或者如果生产者设置的 acks 参数为 0(表示生产者不需要等待任何来自 Kafka 的确认),那么消息发送后,即使 Kafka 没有正确接收,生产者也不会知道,这就很容易导致消息丢失。
先提交offset后处理,会导致消息丢失:消费者在拉取消息后,如果在消息处理完成之前就提交了偏移量,然后在处理过程中出现异常(如程序崩溃、业务逻辑错误导致无法正确处理消息等),那么未处理完成的消息就会被认为已经消费,从而导致消息丢失。
Kafka 代理(Broker)故障:如果 Kafka 代理在消息还没有完全复制到所有同步副本(ISR)之前就发生故障,并且恢复后无法正确恢复这些消息,就可能导致消息丢失。例如,一个消息刚被写入领导者副本(Leader Replica),但还没有来得及复制到追随者副本(Follower Replica),此时领导者副本所在的代理崩溃,且数据无法恢复,那么这条消息就会丢失。
7.Kafka 分区的目的?
实现高吞吐量和水平扩展:
高吞吐量:分区是 Kafka 实现高吞吐量的关键因素。通过将主题(Topic)划分为多个分区,Kafka 可以并行地处理消息。每个分区都可以独立地接收、存储和传输消息,就像多个独立的管道一样。这种并行处理方式大大提高了消息的处理速度,使得 Kafka 能够轻松应对大规模的消息流量。
水平扩展:随着消息数据量的不断增加和系统负载的上升,我们可以通过增加分区的数量来实现水平扩展。当需要处理更多的消息时,只需简单地添加新的分区,而不需要对整个系统进行大规模的架构调整。例如,一个原本有 5 个分区的主题,随着业务的增长,发现消息吞吐量不够,我们可以将分区数量增加到 10 个。新的分区可以分布在不同的服务器(Broker)上,从而分担系统的负载,提高系统的可扩展性。
支持负载均衡和消费者并行消费:
负载均衡: 在Kafka 的生产者端,分区机制可以实现消息发送的负载均衡。生产者可以根据一定的策略(如轮询、基于消息键等)将消息发送到不同的分区。这样可以避免消息集中发送到某一个分区,导致该分区负载过重,而其他分区闲置的情况。
并行消费:在消费者端,分区机制支持消费者的并行消费。在一个消费组(Consumer Group)中,不同的消费者可以同时消费不同分区的消息。这样可以提高消息的消费速度,减少消息的处理时间。
保证消息顺序性(在分区内):
每个分区内部,消息是按照发送的先后顺序进行存储和消费的。这对于一些对消息顺序有严格要求的应用场景非常重要。例如,在一个金融交易系统中,对于同一个账户的交易操作(如存款、取款、转账等)消息,将它们发送到同一个分区,就可以保证这些消息按照交易发生的顺序进行存储和消费。消费者在读取这个分区的消息时,只要按照偏移量(Offset)从小到大的顺序读取,就能保证消息的顺序性,从而满足业务对消息顺序的要求。
8.Kafka 的高可靠性是怎么实现的?
副本机制:
Kafka 为每个分区(Partition)维护多个副本。其中一个副本是领导者副本(Leader Replica),其余的是追随者副本(Follower Replica)。领导者副本负责处理生产者(Producer)和消费者(Consumer)的读写请求,而追随者副本则不断地从领导者副本拉取消息进行同步。
ISR 是与领导者副本保持同步状态的追随者副本集合。Kafka 通过一定的标准来判断副本是否处于同步状态,主要考虑副本与领导者副本的滞后程度,包括消息数量的滞后和时间的滞后。例如,通过配置参数replica.lag.max.messages
和replica.lag.time.max.ms
来确定一个副本是否在 ISR 中。只有在 ISR 中的副本才有资格在领导者副本出现故障时被选举为新的领导者副本,这保证了新的领导者副本的数据是相对较新的,从而维护了数据的可靠性。
当领导者副本出现故障时,Kafka 会从 ISR 中选举一个新的领导者副本。这个选举过程相对快速,并且由于 ISR 中的副本数据是基本同步的,所以系统可以在短时间内恢复正常服务。例如,在一个拥有多个副本的分区中,如果领导者副本所在的代理(Broker)崩溃,Kafka 会在 ISR 中的追随者副本中选择一个作为新的领导者副本,消费者可以继续从新的领导者副本获取消息,整个过程对用户来说可能只是短暂的延迟。
数据持久化机制:
基于日志(Log)的存储方式:Kafka 将消息存储在日志文件中。每个分区都有自己独立的日志文件,消息按照顺序写入日志。这种基于日志的存储方式简单而高效,便于数据的持久化。例如,当生产者发送消息到一个分区时,消息会被追加到该分区的日志末尾,并且日志文件会定期进行清理和归档,以保证存储的高效性。
数据的刷盘策略:afka 提供了多种数据刷盘策略来确保数据的持久存储。可以配置为在消息写入内存后立即刷盘,或者在一定时间间隔或消息数量达到一定阈值后刷盘。例如,通过配置log.flush.interval.messages
和log.flush.interval.ms
参数来控制刷盘的频率。这样可以根据业务需求和硬件性能来平衡性能和数据可靠性。在对数据可靠性要求极高的场景下,可以设置更频繁的刷盘策略,确保数据及时存储到磁盘上,减少数据丢失的风险。
生产者和消费者的可靠性保证措施:
生产者的消息发送确认机制(ACKs):生产者可以通过配置 acks 参数来控制消息发送的可靠性。
当 acks = 0 时,生产者发送消息后不等待任何确认,这种方式性能最高,但可靠性最低,消息可能会丢失。
当 acks = 1 时,生产者等待领导者副本确认收到消息后就认为消息发送成功,这种方式有一定的可靠性,但如果领导者副本在消息同步给追随者副本之前出现故障,消息可能会丢失。
当 acks = - 1(或 all)时,生产者需要等待所有同步副本(ISR)确认收到消息后才认为消息发送成功,这是可靠性最高的方式,虽然会牺牲一定的性能,但可以确保消息在多个副本中都成功存储。
消费者的偏移量(Offset)管理:消费者通过提交偏移量来记录已经消费的消息位置。合理的偏移量管理可以避免消息重复消费或丢失。消费者可以选择自动或手动提交偏移量。在自动提交模式下,消费者会按照一定的时间间隔提交偏移量,但如果在提交偏移量后消息处理出现问题,可能会导致消息丢失。在手动提交模式下,消费者可以在确保消息成功处理后再提交偏移量,这样可以更好地控制消息的消费状态,提高可靠性。
9.topic的分区数可不可以增加?为什么增加?
增加分区数的原因:
适应业务增长:随着业务的发展和数据量的增加,现有的分区可能无法满足高吞吐量的需求。
实现负载均衡优化:如果发现主题的消息在现有分区之间分布不均匀,导致部分分区负载过重,而其他分区资源闲置,增加分区数并重新分配消息可以优化负载均衡。
增加方法:
使用 kafka - topics.sh 脚本(对于 Kafka 自带的命令行工具):
bin/kafka - topics.sh --bootstrap - server <bootstrap - servers> --alter --topic <topic - name> --partitions <new - partition - count>
class="hljs-button signin active add_def" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">
评论记录:
回复评论: