Kafka的消费消息是如何传递的?

大家好,我是锋哥。今天分享关于【Kafka的消费消息是如何传递的?】面试题。希望对大家有帮助;

Kafka的消费消息是如何传递的?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

Kafka 的消息传递是通过 消费者(Consumer)消费者组(Consumer Group) 来进行管理的。Kafka 设计了一个高效的消息传递机制,支持高吞吐量、容错和分布式架构,下面是 Kafka 消息消费的基本过程:

1. 主题(Topic)和分区(Partition)

Kafka 将消息分为不同的主题(Topic),每个主题可以有多个分区(Partition)。这些分区在 Kafka 集群中分布,可以跨多个机器进行分布式存储和处理。

  • 分区:每个分区中的消息是有序的。Kafka 为了实现扩展性,将一个大的 Topic 切割成多个分区。每个消息在分区内都有一个唯一的 offset,即在该分区中的位置。
  • 消息顺序:消息在一个分区内是有序的,但不同分区之间的顺序是无法保证的。

2. 消费者(Consumer)

消费者从 Kafka 集群中拉取消息。每个消费者通过订阅特定的 Topic 或分区来获取消息。消费者按顺序消费消息,并通过 offset 记录消费的进度。

消费者的工作原理:
  • 消费者从 Kafka 的某个分区中读取消息,并根据 offset 跟踪已消费的消息位置。
  • 每个消费者都能独立地选择开始消费的 offset,这意味着消费者可以从任何消息开始消费,而不仅仅是从最新的消息。

3. 消费者组(Consumer Group)

Kafka 引入了 消费者组 的概念,以实现负载均衡和容错性。消费者组将多个消费者组织成一个组,每个消费者只消费分配给它的分区中的消息,避免了同一个分区的消息被多个消费者重复消费。

消费者组的工作原理:
  • 负载均衡:在一个消费者组内,Kafka 会将 Topic 的多个分区分配给消费者。每个消费者最多只能消费一个分区(可以没有分配到分区),而同一个分区只能由同一个消费者消费。消费者组内的消费者数量和分区数量应该相对匹配,避免资源浪费。
  • 消息的分配:Kafka 会根据消费者组内的消费者数量动态地调整消息的分配。如果消费者增加,Kafka 会重新平衡分区的分配。反之,如果消费者减少,Kafka 会将该消费者原先负责的分区重新分配给其他消费者。
消费者组的优势:
  • 高可用性:当一个消费者宕机时,其他消费者会重新接管该消费者负责的分区,保证了消息的消费不受影响。
  • 扩展性:通过增加消费者,Kafka 可以横向扩展消费能力。

4. 偏移量管理(Offset Management)

Kafka 会记录每个消费者的消息消费进度,即偏移量(offset)。偏移量是在分区内唯一的标识符,表示该消费者已经消费到的位置。

  • 自动提交:Kafka 允许消费者自动提交偏移量,消费者每次拉取消息后会自动提交当前消息的偏移量。
  • 手动提交:消费者也可以选择手动提交偏移量,确保消息消费的精确控制,适用于需要确保消息可靠处理的场景。

偏移量存储的位置:

  • Kafka 内部的偏移量存储:消费者组的偏移量可以存储在 Kafka 的 __consumer_offsets 内部主题中。每个消费者组都有一个偏移量记录,以便在消费者重启或重新加入时恢复消费进度。
  • 外部存储:如果有特别的需求,也可以将偏移量存储在外部数据库中,例如 Zookeeper 或数据库,Kafka 本身并不强制要求偏移量的存储方式。

5. 消费者拉取消息

消费者通过拉取(pull)方式获取消息。消费者会向 Kafka 集群的某个分区请求消息,可以指定从哪个 offset 开始读取。

  • 拉取请求:消费者向 Kafka 发送拉取请求,指定要从哪个分区的哪个 offset 开始拉取。
  • 返回消息:Kafka 响应消费者请求,返回消息及其对应的 offset

6. 消息的确认与重试

在 Kafka 中,消息消费的确认方式(即偏移量的提交)决定了消息是否被认为已成功消费。消费者在接收到消息并处理后,会将偏移量提交给 Kafka。

  • 自动提交偏移量:如果消费者设置为自动提交模式,它会在每次拉取消息后自动提交当前消息的偏移量。这样,即使消费者宕机,Kafka 也能知道最后一个成功消费的消息。
  • 手动提交偏移量:如果消费者选择手动提交偏移量,它可以在确保消息处理成功后,显式提交偏移量。如果在消费过程中发生失败,消费者可以选择不提交偏移量或回滚到之前的偏移量重新消费。

7. 消息的消费保证

Kafka 支持三种消费保证:

  • At most once:每条消息最多消费一次,如果消费者未成功处理,消息不会被重新消费。
  • At least once:每条消息至少被消费一次,确保不会丢失消息,但可能会重复消费消息。
  • Exactly once:每条消息只会被消费一次,保证消息处理的准确性。

通常,Kafka 会在消费者的处理逻辑中结合消费者的业务需求来保证消息的准确性和重复消费的容忍度。

8. 流量控制和背压

Kafka 提供了流量控制机制,消费者通过调整拉取消息的速率来避免处理过多的消息。如果消费者处理不过来,Kafka 会阻止过多消息的传输,从而实现背压。

总结

Kafka 的消息消费是通过 消费者组分区 机制进行的。每个消费者只消费某个分区内的消息,并根据偏移量跟踪进度。消费者组能够实现负载均衡,保证消息的高效消费和容错性。消息的消费保证模式(如 at most onceat least onceexactly once)确保了不同业务场景下的不同需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/931946.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux-ADC驱动实验

上一章我们讲解了如何给 ICM20608 编写 IIO 驱动,ICM20608 本质就是 ADC,因此纯粹的 ADC 驱动也是 IIO 驱动框架的。本章我们就来学习一下如何使用 I.MX6ULL 内部的 ADC,并且在学习巩固一下 IIO 驱动。 ADC 驱动源码简析 设备树下的 ADC 节点…

如何制作“优美”PPT

目录 1.免费PPT模板网站: 2.免费有较好质量的图片网站: 免费图片资源 免费透明PNG图片资源: 免费icon图片资源: 3.选择好的图片: 图片底色 4.要与不要 千万不要: 一定要: 6.一些建议…

SSRF对Redis进行内网渗透

SSRF对Redis进行内网渗透 一 环境搭建 准备一台服务器&#xff0c;开启lampp和redis&#xff0c;redis只允许内网访问 使用kali进行端口扫描&#xff0c;扫不到6379 使用kali连接redis&#xff0c;也连不上 ssrf漏洞代码 <?php ​$url $_GET[url]; ​// 创建一个cUR…

面经自测——死锁/死锁的必要条件/死锁的预防/进程通信的方式

前言 本文是作者专门用来自测Java后端相关面试题的&#xff0c;所有问题都是在牛客、知识星球或网上找到的最近最新的面试题&#xff0c;全文回答都是作者按自己的真实水平仿照真实环境的回答&#xff0c;所以答案不一定真实&#xff08;但回答一定真诚&#x1f923;&#xff0…

计算机网络研究实训室建设方案

一、概述 本方案旨在规划并实施一个先进的计算机网络研究实训室&#xff0c;旨在为学生提供一个深入学习、实践和研究网络技术的平台。实训室将集教学、实验、研究于一体&#xff0c;覆盖网络基础、网络架构、网络安全、网络管理等多个领域&#xff0c;以培养具备扎实理论基础…

React开发 - 技术细节汇总一

React简介 React 是一个声明式&#xff0c;高效且灵活的用于构建用户界面的 JavaScript 库。使用 React 可以将一些简短、独立的代码片段组合成复杂的 UI 界面&#xff0c;这些代码片段被称作“组件”。 ui render (data) -> 单向数据流 MVC // model var myapp {}; // …

嵌入式蓝桥杯学习4 lcd移植

cubemx配置 复制前面配置过的文件 打开cubemx&#xff0c;将PB8,PB9配置为GPIO-Output。 点击GENERATE CODE. 文件移植 1.打开比赛提供的文件包&#xff0c;点击Inc文件夹 2.点击Inc文件夹。复制fonts.h和lcd.h&#xff0c;粘贴到我们自己的工程文件夹的bsp中&#xff08…

迭代器模式的理解和实践

引言 在软件开发中&#xff0c;我们经常需要遍历容器对象&#xff08;如数组、列表、集合等&#xff09;中的元素。如果每个容器对象都实现自己的遍历算法&#xff0c;那么代码将会变得冗余且难以维护。为了解决这个问题&#xff0c;迭代器模式应运而生。迭代器模式是一种行为型…

STM32一keil5更换芯片后报错问题的解决。

目录 一、STM32型号认识二、报错问题三、常用的启动配置文件四、问题解决 一、STM32型号认识 二、报错问题 当我们在原来工程下修改芯片时&#xff0c;原本可以编译通过的代码突然很多报错。如下所示&#xff0c;这是因为我们的启动文件配置错误。对于不同型号的芯片其flash容量…

人工智能-自动驾驶领域

目录 引言自动驾驶与人工智能的结合为什么自动驾驶领域适合发表文章博雅智信的自动驾驶辅导服务结语 引言 自动驾驶技术的崛起是当代交通行业的一场革命。通过结合先进的人工智能算法、传感器技术与计算机视觉&#xff0c;自动驾驶不仅推动了技术的进步&#xff0c;也使得未来…

c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序

高阶排序 1、快速排序 冒泡排序的升级算法 每次选择一个基准数&#xff0c;把小于基准数的放到基准数的左边&#xff0c;把大于基准数的放到基准数的右边&#xff0c;采用 “ 分治算法 ”处理剩余元素&#xff0c;直到整个序列变为有序序列。 最好和平均的复杂度&#xff1a…

修改MySQL存储路径

1.查看原路径 show variables like ‘%datadir%’; 2.停止MYSQL 以管理员身份运行命令提示符 net stop MySQL84 在服务中直接停止MySQL 3.编辑配置文件 可能会遇到无权限修改&#xff0c;可以先修改my.ini的权限。可以通过&#xff1a;右键my.ini → 属性 → 安全→ 编辑 …

微信小程序报错:http://159.75.169.224:7300不在以下 request 合法域名列表中,请参考文档

要解决此问题&#xff0c;需打开微信小程序开发者工具进行设置&#xff0c;打开详情-本地设置重新运行&#xff0c;该报错就没有啦

深入浅出:使用 Gin 框架生成 API 文档

深入浅出&#xff1a;使用 Gin 框架生成 API 文档 在现代 Web 开发中&#xff0c;API 文档是开发者之间沟通的重要桥梁。它不仅帮助前端开发者理解如何调用后端接口&#xff0c;还为测试人员和运维人员提供了宝贵的参考。对于 Go 语言开发者来说&#xff0c;Gin 是一个非常流行…

【 工具变量】IPCC碳排放因子数据测算表

一、数据简介&#xff1a; 排放因子法是IPCC提出的一种碳排放估算方法&#xff0c;也是目前适用范围最广、应用最为普遍的方法。将各类能源消耗的实物统计量转变为标准统计量&#xff0c;再乘以各自的碳排放因子&#xff0c;加总之后就可以得到碳排放总量。如果按照ISO14064标…

兔子的寿命有多长?

在宠物的世界里&#xff0c;兔子以其灵动的身姿、柔软的皮毛和温顺的性格深受人们喜爱。然而&#xff0c;当我们满心欢喜地将兔子迎进家门时&#xff0c;可曾想过它们能陪伴我们多久&#xff1f;兔子的寿命&#xff0c;是一个值得深入探讨的话题&#xff0c;它不仅关乎生命的时…

echarts地图立体效果,echarts地图点击事件,echarts地图自定义自定义tooltip

一.地图立体效果 方法1:两层地图叠加 实现原理:geo数组中放入两个地图对象,通过修改zlevel属性以及top,left,right,bottom形成视觉差 配置项参考如下代码: geo: [{zlevel: 2,top: 96,map: map,itemStyle: {color: #091A51ee,opacity: 1,borderWidth: 2,borderColor: #16BAFA…

游戏发布AppStore平台

首先&#xff0c;要注册一个开发者账号。这里不多说了&#xff0c;下载官方app“Developer”&#xff0c;然后买个能发布的账号&#xff0c;个人&#x1f4b2;99的就行。&#xff08;其实还有点麻烦&#xff0c;我的好像是人脸识别后出问题了&#xff0c;反正遇到问题找苹果官方…

​​​​​​​移远通信基于高通平台发布可集成边缘计算功能的5G MBB解决方案

在5G技术与人工智能深度融合的背景下&#xff0c;各行各业正迎来前所未有的创新机遇。为了加速5G移动宽带&#xff08;MBB&#xff09;行业向智能化转型&#xff0c;并简化边缘计算应用的开发流程&#xff0c;移远通信近期隆重推出了基于骁龙5G调制解调器及射频系统打造&#x…

flinkSql 将流和表的互相转换

流——>表 方式一 方式二 方式一&#xff1a;写sql DataStreamSource<String> source env.socketTextStream("localhost", 8881); // 表名&#xff0c;流&#xff0c;字段名称 tableEnv.createTemporaryView("t_1",source&#xff0c;$("…