Kafka知识总结(事务+数据存储+请求模型+常见场景)

news2025/1/12 10:49:01

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

事务

事务Producer保证消息写入分区的原子性,即这批消息要么全部写入成功,要么全失败。此外,Producer重启回来后,kafka依然保证它们发送消息的精确一次处理。

开启enable.idempotence = true

设置Producer端参数transctional.id

数据的发送需要放在beginTransaction和commitTransaction之间。

Consumer端的代码也需要加上isolation.level参数,用以处理事务提交的数据。

producer.initTransactions();
try {
     producer.beginTransaction();
     producer.send(record1);
     producer.send(record2);
     producer.commitTransaction();
} catch (KafkaException e) {
     producer.abortTransaction();
}

事务Producer虽然在多分区的数据处理上保证了幂等,但是处理性能上相应的是会有一些下降的。

数据存储

Kafka 消息以 Partition 作为存储单元,每个 Topic 的消息被一个或者多个 Partition 进行管理。

  • Partition 是一个有序的,不变的消息队列,消息总是被追加到尾部。
  • 一个 Partition 不能被切分成多个散落在多个 Broker 上或者多个磁盘上。

Partition 又划分成多个 Segment 来组织数据。

Segment 在它的下面还有两个组成部分:

  • 索引文件:以 .index 后缀结尾,存储当前数据文件的索引。
  • 数据文件:以 .log 后缀结尾,存储当前索引文件名对应的数据文件。

在这里插入图片描述

请求模型

在这里插入图片描述

请求到Broker后,也会通过类似于请求转发的组件Acceptor转发到对应的工作线程上,Kafka中被称为网络线程池,一般默认每个Broker上为3个工作线程,可以通过参数 num.network.threads 进行配置。

并且采用轮询的策略,可以很均匀的将请求分发到不同的网络线程中进行处理。

但是实际的处理请求并不是由网络线程池进行处理的,而是会交给后续的IO线程池,当网络线程接受到请求的时候,会将请求写入到共享的请求队列中,而IO线程池会进行异步的处理,默认情况下是8个,可以通过 num.io.threads 进行配置。

常见场景

重复消费

consumer 在消费过程中,应用进程被强制kill掉或发生异常退出。

例如在一次poll500条消息后,消费到200条时,进程被强制kill消费到offset未提交,或出现异常退出导致消费到offset未提交。

下次重启时,依然会重新拉取500消息,造成之前消费到200条消息重复消费了两次。

消费者消费时间过长。

max.poll.interval.ms参数定义了两次poll的最大间隔,它的默认值是 5 分钟,表示你的 Consumer 程序如果在 5 分钟之内无法消费完 poll 方法返回的消息,那么 Consumer 会主动发起 离开组 的请求,Coordinator 也会开启新一轮 Rebalance。

因为上次消费的offset未提交,再次拉取的消息是之前消费过的消息,造成重复消费。

提高消费能力,提高单条消息的处理速度;根据实际场景max.poll.interval.ms值设置大一点,避免不必要的rebalance;

可适当减小max.poll.records的值,默认值是500,可根据实际消息速率适当调小。

消息丢失

消费者程序丢失数据

Consumer 程序从 Kafka 获取到消息后开启了多个线程异步处理消息,而 Consumer 程序自动地向前更新位移

假如某个线程运行失败了,它负责的消息没有被成功处理,但位移已经被更新了,因此这条消息对于 Consumer 而言实际上是丢失了。

最佳配置:

不要使用 producer.send(msg),而要使用 producer.send(msg, callback)

设置 acks = all:

  • 设置成 all,则表明所有副本 Broker 都要接收到消息,该消息才算是 已提交。

设置 retries 为一个较大的值。

  • 当出现网络的瞬时抖动时,消息发送可能会失败,此时配置了retries > 0 的 Producer 能够自动重试消息发送,避免消息丢失。

设置 unclean.leader.election.enable = false

设置 replication.factor >= 3

  • 防止消息丢失的主要机制就是冗余。

设置 min.insync.replicas > 1

  • 控制的是消息至少要被写入到多少个副本才算是 已提交 。
  • 设置成大于 1 可以提升消息持久性。
  • 在实际环境中千万不要使用默认值 1。

确保 replication.factor > min.insync.replicas

  • 如果两者相等,那么只要有一个副本挂机,整个分区就无法正常工作了。

确保消息消费完成再提交。

  • Consumer 端有个参数 enable.auto.commit,最好把它设置成 false,并采用手动提交位移的方式。

消息顺序

乱序场景一

因为一个topic可以有多个partition,kafka只能保证partition内部有序。

1、可以设置topic 有且只有一个partition。

2、根据业务需要,需要顺序的指定为同一个partition。

乱序场景二

对于同一业务进入了同一个消费者组之后,用了多线程来处理消息,会导致消息的乱序。

消费者内部根据线程数量创建等量的内存队列,对于需要顺序的一系列业务数据,根据key或者业务数据,放到同一个内存队列中,然后线程从对应的内存队列中取出并操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs与npm版本对应表

Node.js — Node.js 版本 (nodejs.org)

GB28181国标视频汇聚平台EasyCVR视频管理系统如何更改GIS地图的默认位置?

GB28181国标视频汇聚平台EasyCVR视频管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力,为各行各业的视频监控需求提供了优秀的解决方案。通过简单的配置和操作流程,用户可以轻松地进行远程视频监控、存储和查看&#xff0…

【Qt开发】No matching signal for on_toolButton_clicked() 解决方案

【Qt开发】No matching signal for on_toolButton_clicked() 解决方案 文章目录 No matching signal for xxx 解决方案附录:C语言到C的入门知识点(主要适用于C语言精通到Qt的C开发入门)C语言与C的不同C中写C语言代码C语言到C的知识点Qt开发中…

【C51】8051 微控制器入门指南

目录 1. 理解 C51 编程环境1.1 了解 8051 微控制器架构1.2 设置开发环境 2. 编写 C51 嵌入式代码2.1 基础代码结构2.2 使用寄存器和 I/O 端口2.3 中断处理2.4 调试和测试 3. 高级特性和优化3.1 嵌套中断3.2 内存管理3.3 外设接口3.4 编译器优化 4. 示例项目4.1 LED 闪烁程序4.2…

vardaccico前端私有库

vardacico docker pull verdaccio/verdaccio:4 docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio Docker | Verdaccio 拷贝docker中的配置到宿主机 进入docker内部 docker exec -it verdaccio /bin/sh 进入到指定目录 cd /verdaccio 开始拷贝到指定目…

BOM管理挑战:识别不同业务需求下的应对策略

BOM作为制造行业中的核心概念,其架构的复杂度直接影响到企业的运营效率、成本控制以及市场响应速度。道合顺接下来将介绍如何在管理目标与BOM架构复杂度之间找到平衡点,以满足不同业务需求,助力企业在激烈的市场竞争中脱颖而出。 一、理解BO…

window下编译UCL

window下编译UCL 一、环境安装二、编译error: ACC conformance test failed. Stop. 一、环境安装 安装minGW minGW中安装g 和gcc 安装msys-base 二、编译 启动msys.bat C:\MinGW\msys\1.0\msys.bat 切换到ucl源码目录 执行语句 ./configure CPPFLAGS"$CPPFLAGS -stdc…

昇思25天学习打卡营第19天|DCGAN生成漫画头像

DCGAN生成漫画头像总结 实验概述 本实验旨在利用深度卷积生成对抗网络(DCGAN)生成动漫头像,通过设置网络、优化器以及损失函数,使用MindSpore进行实现。 实验目的 学习和掌握DCGAN的基本原理和应用。熟悉使用MindSpore进行图像…

气象水文耦合模WRF-Hydro建模技术

原文链接:气象水文耦合模WRF-Hydro建模技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247610398&idx4&sn34b4bbed4c74dcbbb0ac19ef8dcdaaff&chksmfa8271f9cdf5f8ef34ea6f721736a2fbbf8be896744ab7e46caa571c52a30628f056b4bd6964&t…

AI如何助力UI设计师互联网学习?

嘿,咱 UI 设计师想用互联网学习,可真不容易!资料筛选难,学习资源杂,真让人头疼。不过还好有 AI 工具能帮忙,提效率! 这一年多来,我在 ai123.cn 这个平台上,可算是找到了…

羊大师:羊奶营养揭秘,健康关爱的另一优选选择

在琳琅满目的乳制品中,羊奶如同一颗璀璨的明珠,以其独特的营养价值和健康益处,逐渐走进千家万户,成为许多人健康关爱的新选择。那么,羊奶究竟蕴藏着怎样的营养奥秘,让它能够在众多饮品中脱颖而出呢&#xf…

【MySQL】:在Centos 7 环境下的安装

朋友们、伙计们,我们又见面了,本期来给大家带来如何在Centos7环境下安装MySQL,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通…

关于C++11一些新特性的介绍(下)

文章目录 1. 可变参数模板1.1 可变参数模板介绍1.2 STL容器中的empalce相关接口函数 2. lambda表达式2.1 lambda诞生背景2.2 lambda表达式语法2.3 捕捉列表说明2.4 函数对象与lambda表达式 3. 包装器3.1 function包装器3.2 bind函数 1. 可变参数模板 1.1 可变参数模板介绍 C1…

我的创作纪念日(一)——Giser?Noder?不如“Computer”

目录 Giser?Noder?不如“Computer” 一、根源:保持学习习惯的刚需 二、机缘:processOn的另类替代 三、日常:对技术栈丰富的思考 四、成就:保持心态健康的活着 五、憧憬:能一直心态健康的活…

大模型学习(1)

初学者,仅做自己学习记录,如果对你有什么帮助,那更好了。 下面是论文《Attention Is All You Need》的经典transformer架构,在学习的过程中,有很多疑惑。 embedding层在做什么 Transformer的embedding层在做的是将输…

【C++进阶】AVL树详解

文章目录 1. AVL树的概念2. AVL树结点的定义3. AVL 树的插入3.1 关于平衡因子3.2 插入代码 4. AVL 树的旋转逻辑4.1 不需要旋转4.2 左旋4.3 右旋4.4 双旋4.4.1 先右后左单旋(RL 旋转)4.4.2 先左后右单旋(LR 旋转) 4.5 完整插入代码…

正则采集器之五——商品匹配规则

需求设计 实现分析 系统通过访问URL得到html代码,通过正则表达式匹配html,通过反向引用来得到商品的标题、图片、价格、原价、id,这部分逻辑在java中实现。 匹配商品的正则做成可视化编辑,因为不同网站的结构不同,同…

24小时在线的仪控专家

近年来,随着流程行业自动化水平的不断提高,仪表、阀门等设备在生产装置中的数量也越来越多,扮演着“眼睛”、“双手”和“神经”等角色,与生产过程的安全平稳息息相关,对企业追求效益最大化起着举足轻重的作用。 但仪控…