问你为什么选择Kafka,你会怎么回答?

简介: 可靠的含义在百度百科的解释是:可以信赖、可以相信、可靠的朋友。那Kafka究竟是不是一个可靠的朋友呢?既然全世界绝大部分高可用系统都有Kafka的支持,Kafka必定有其过人之处,跟着我来分析分析。另外多提一嘴Kafka在GitHub目前已有star数27.6k、fork数13.6k。本文收录在我开源的《Java学习面试指南》中,一份覆盖Java程序员所需掌握的Java核心知识、面试重点。希望收到大家的 ⭐ Star ⭐支持。,相信你看了一定不会后悔。

可靠的含义在百度百科的解释是:可以信赖、可以相信、可靠的朋友。那Kafka究竟是不是一个可靠的朋友呢?既然全世界绝大部分高可用系统都有Kafka的支持,Kafka必定有其过人之处,跟着我来分析分析。

另外多提一嘴Kafka在GitHub目前已有star数27.6k、fork数13.6k。

在可靠的人手中,有强人在关照

在可靠的人手中,有强人在关照

本文收录在我开源的《Java学习面试指南》中,一份覆盖Java程序员所需掌握的Java核心知识、面试重点。希望收到大家的 ⭐ Star ⭐支持。GitHub地址:https://github.com/hdgaadd/JavaGetOffer,相信你看了一定不会后悔。

1. Kafka高水位

面试官:知道Kafka高水位吗?

我们都知道Kafka消息保存在首领分区和分区副本中,Kafka要保证即使从分区副本读取消息也只会读取已提交的消息。Kafka的高水位就是为了这个目标而开发出来的。

如果大家对消息已提交的概念不清楚的话,可以看下以下的解释。

Kafka的消息只有在所有分区副本都同步该消息后,才算是已提交的消息

在分区复制的过程中,首领分区会在发送的数据里加入当前高水位。当前高水位就是复制偏移量,记录了当前已提交消息的最大偏移量。而分区副本就可以根据首领分区副本提供的高水位,来避免未提交的消息被消费者消费。

就如下图,最大偏移量的限制就像海面上的水位。

在这里插入图片描述

2. Kafka消息可靠性

2.1 消息存储可靠性

面试官:你说说Kafka是怎么保证消息可靠性的?

大家在回答面试官问题前可以思考下,可靠性的含义是什么?

在业务系统中,消息的不丢失是最重要的,数据即是金钱。如果把客户的一条支付消息丢失,而这条支付信息的涉及的金额不菲,想想对公司的损失有多大。所以可靠性意味着对消息的存储和保护。

Kafka在这方面采用了复制机制和分区多副本架构来作为消息可靠性的核心。

(1)分区多副本架构。

Kafka的所有主题被分为了多个分区存储在多个Broker里,而每个分区可以有多个副本。例如有4个Broker节点,Broker1存储了分区首领副本,而Broker2、Broker3可以存储其分区副本。

Kafka对消息的存储有多个分区副本来支持,可以避免单点问题导致数据丢失找不回来的情况。

(2)复制机制。

在通常情况下消费者都是从首领副本里读取消息,同时会有n(复制系数)个Broker机器会去同步复制首领副本后,生成跟随者副本也就是分区副本。

如果首领副本的机器挂了,分区副本就会选举成为新的首领副本

复制机制保证了分区副本和首领副本的数据一致性,有复制机制的加持,分区多副本架构才是可用的。

2.2 生产者消费者可靠性

面试官:还有呢?

上面所说的其实是基于Broker层面带给Kafka的可靠性保障,我们还需要在生产者、消费者层面下功夫,来使整个系统减少丢失数据的风险。

一、在生产者方面。

Kafka提供了多种发送确认模式,我们可以根据业务的可靠性需求配置合适的acks。

  1. ack = 0。如果消息生产者能够把消息通过网络发送出去,则认为消息已成功写入。
  2. ack = 1。如果首领分区收到消息并成功写入,生产者收到确认返回,则认为消息已成功写入。
  3. ack = all。只有在消息成功写入所有分区副本后,才认为消息已成功写入。这保证了消息的多备份。

以上的各种acks情况如果失败的话,我们可以让生产者继续重试发送消息,直到Kafka返回成功。

二、在消费者方面

大家如果能回答上文第一个面试官问题:知道Kafka高水位吗,就知道Kafka高水位保证了消费者只会读取到已提交的数据,即被写入所有分区副本的数据。所以消费者要确保的是跟踪哪些数据已读取了、哪些数据未读取。

  1. 消费者消费消息时会先获取一批消息,同时从最后一个偏移量开始读取,这保证了消息的顺序性
  2. 消费者消费消息后会同步提交、异步提交偏移量,保证了消息不被其他消费者重复消费

2.3 消费堆积问题

面试官:那要是Kafka消费堆积了你怎么处理?

这个问题是面试官常考的一个问题,我们要从Broker和消费者两方面来看。

一、Broker的话。

  1. 每个topic是分为多个分区给不同Broker进行处理,要合理分配分区数量来提高Broker的消息处理能力。比如3个Broker2个分区,可以改为3个Broker3个分区。
  2. 可以横向扩展Broker集群,来提高Broker的消息处理能力。

二、消费者的话。

  1. 可以增加消费者服务数量来提高消息消费能力。
  2. 在提交偏移量时,可以把同步提交改为异步提交。异步提交无需等待Kafka的确认返回,减少了同步等待Broker的时间。

3. Kafka控制器

面试官:知道Kafka控制器吧?

Kafka控制器其实也是一个Broker,不过它还负责选举分区首领。Kafka的控制器和Redis集群的哨兵的选举功能是一样的。

也就是在首领副本所在的分区失效后,Kafka会通过控制器来在分区副本里选举出新的首领副本

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关文章
|
消息中间件 存储 网络协议
【Kafka】Kafka 性能高的原因分析
【4月更文挑战第5天】【Kafka】Kafka 性能高的原因分析
|
负载均衡 Cloud Native 数据库
构建高可用的云原生微服务架构:实现弹性和可扩展性
随着云计算技术的快速发展,云原生微服务架构成为了现代应用开发领域中的一种重要范式。它通过利用云服务提供的弹性和可扩展性,为企业构建高可用的、面向未来的应用程序。本文将探讨云原生微服务的概念、核心原则以及一些关键技术,帮助您设计和构建具有弹性和可伸缩性的架构。
1388 1
Axure实战18:创建一个PRD产品需求文档生成器
Axure实战18:创建一个PRD产品需求文档生成器
1176 0
Axure实战18:创建一个PRD产品需求文档生成器
|
10月前
|
人工智能 智能硬件
SPAR:智谱 AI 推出自我博弈训练框架,基于生成者和完善者两个角色的互动,提升了执行准确度和自我完善能力
SPAR 是智谱团队推出的自我博弈训练框架,旨在提升大型语言模型在指令遵循方面的能力,通过生成者和完善者的互动以及树搜索技术优化模型响应。
262 0
SPAR:智谱 AI 推出自我博弈训练框架,基于生成者和完善者两个角色的互动,提升了执行准确度和自我完善能力
|
消息中间件 存储 缓存
为什么 Kafka 的吞吐量那么高?
为什么 Kafka 的吞吐量那么高?
315 2
|
存储 人工智能 大数据
AI驱动下的云存储创新
随着大数据时代的到来,云存储作为数据存储和管理的核心基础设施,其重要性日益凸显。同时, AI 快速发展也为云存储的进化与创新提供了强大的驱动力。本话题将解读AI 驱动下云存储的进化趋势,分享阿里云存储的创新技术,助力企业实现数字化升级。
718 5
|
消息中间件 Java Kafka
如何在Kafka分布式环境中保证消息的顺序消费?深入剖析Kafka机制,带你一探究竟!
【8月更文挑战第24天】Apache Kafka是一款专为实时数据管道和流处理设计的分布式平台,以其高效的消息发布与订阅功能著称。在分布式环境中确保消息按序消费颇具挑战。本文首先介绍了Kafka通过Topic分区实现消息排序的基本机制,随后详细阐述了几种保证消息顺序性的策略,包括使用单分区Topic、消费者组搭配单分区消费、幂等性生产者以及事务支持等技术手段。最后,通过一个Java示例演示了如何利用Kafka消费者确保消息按序消费的具体实现过程。
621 3
|
运维 监控 Java
面经:Storm实时计算框架原理与应用场景
【4月更文挑战第11天】本文是关于Apache Storm实时流处理框架的面试攻略和核心原理解析。文章分享了面试常见主题,包括Storm的架构与核心概念(如Spout、Bolt、Topology、Tuple和Ack机制),编程模型与API,部署与运维,以及应用场景与最佳实践。通过代码示例展示了如何构建一个简单的WordCountTopology,强调理解和运用Storm的关键知识点对于面试和实际工作的重要性。
818 4
面经:Storm实时计算框架原理与应用场景
|
前端开发 JavaScript API
document.queryselector怎么用
document.queryselector怎么用
440 0
|
存储 网络协议 安全
「译文」CMDB 最佳实践技术指南 -3-CMDB 应用映射 - 技术原理和最佳实践
「译文」CMDB 最佳实践技术指南 -3-CMDB 应用映射 - 技术原理和最佳实践