如何更好地使用Kafka? - 故障时解决

news2024/9/28 23:34:45

要确保Kafka在使用过程中的稳定性,需要从kafka在业务中的使用周期进行依次保障。主要可以分为:事先预防(通过规范的使用、开发,预防问题产生)、运行时监控(保障集群稳定,出问题能及时发现)、故障时解决(有完整的应急预案)这三阶段。

另外的篇幅请参考

如何更好地使用Kafka? - 事先预防篇-CSDN博客

如何更好地使用Kafka? - 运行监控篇-CSDN博客

防微杜渐,遇到问题/故障时有完整的应急预案,以快速定位并解决问题。

1. Kafka消息堆积紧急预案

问题描述:消费端产生消息积压,导致依赖该消息的服务不能及时感知业务变化,导致一些业务逻辑、数据处理出现延迟,容易产生业务阻塞和数据一致性问题。

方案:问题排查、扩容升配策略、消息Topic转换策略、可配置多线程的消费策略。

1.1 问题排查

遇到消息积压时,具体可以从以下几个角度去定位问题原因:

  1. 消息生产端数据量是否存在陡升的情况

  2. 消息消费端消费能力是否有下降

  3. 消息积压是发生在所有的partition还是所有的partition都有积压情况

对于第1、2点导致的消息积压:为暂时性的消息积压,通过扩分区、扩容升配、多线程消费、批量消费等方式提高消费速度能在一定程度上解决这类问题。

对于第3点导致的消息积压:可以采用消息Topic中转策略。

1.2 扩容升配策略

  1. 检查生产端消费发送情况(主要检查是否继续有消息产生、是否存在逻辑缺陷、是否有重复消息发送)

  2. 观察消费端的消费情况(预估下堆积消息的处理清理以及是否有降低趋势)

  3. 若为生产端问题,则评估是否可以通过增加分区数、调整偏移量、删除topic(需要评估影响面)等解决

  4. 消费端新增机器及依赖资源,提高消费能力;

  5. 如果涉及数据一致性问题,需要通过数据比对、对账等功能进行校验。

1.3 配置多线程的消费策略

简而言之,即线程池消费+动态线程池配置策略:将接收到的kafka数据进行hash取模(如果kafka分区接受消息已经是取模的了,这里一定要对id做一次hash再取模)发送到不同的队列,然后开启多个线程去消费对应队列里面的数据。

设计思路:

  1. 在应用启动时初始化对应业务的顺序消费线程池(demo中为订单消费线程池)

  2. 订单监听类拉取消息提交任务至线程池中对应的队列

  3. 线程池的线程处理绑定队列中的任务数据

  4. 每个线程处理完任务后增加待提交的offsets标识数

  5. 监听类中校验待提交的offsets数与拉取到的记录数是否相等,如果相等则

  6. 手动提交offset(关闭kafka的自动提交,待本次拉取到的任务处理完成之后再提交位移)

另外,可以根据业务流量调整的线程配置与pod的配置,如高峰期设置一个相对较高的并发级别数用来快速处理消息,平峰期设置一个较小的并发级别数来让出系统资源。这里,可以参考美团提供的一种配置中心修改配置动态设置线程池参数的思路,实现动态的扩容或者缩容。

实现了动态扩容与缩容:

  1. 通过配置中心刷新OrderKafkaListener监听类中的配置concurrent的值,

  2. 通过set方法修改concurrent的值时,先修改stopped的值去停止当前正在执行的线程池。

  3. 执行完毕后通过新的并发级别数新建一个新的线程池,实现了动态扩容与缩容。

此外,还可以新增开关,它设置为true是可以中断启动中的线程池,故障时进行功能开关。

注意: 如果涉及数据一致性问题,需要通过数据比对、对账等功能进行校验。

1.4 Topic中转策略

当消息积压是发生在所有的partition还是所有的partition都有积压情况时,只能操作临时扩容,以更快的速度去消费数据了。

设计思路:

  1. 临时建立好原先10倍或者20倍的queue数量(新建一个topic,partition是原来的10倍)。

  2. 然后写一个临时分发消息的consumer程序,这个程序部署上去消费积压的消息,消费之后不做耗时处理,直接均匀轮询写入临时建好分10数量的queue里面。

  3. 紧接着征用10倍的机器来部署consumer,每一批consumer消费一个临时queue的消息。

  4. 这种做法相当于临时将queue资源和consumer资源扩大10倍,以正常速度的10倍来消费消息。

  5. 等快速消费完了之后,恢复原来的部署架构,重新用原来的consumer机器来消费消息。

改进:

  1. consumer程序可以写在服务里面;

  2. 指定一个“预案topic”,在服务中预先写好对“预案topic”

  3. 采用策略模式进行”业务topic“->“预案topic”的转换;

注意:

  1. 如果涉及数据一致性问题,需要通过数据比对、对账等功能进行校验。

  2. 需要有个单独的topic转换服务,或修改服务代码,或在事前将多线程逻辑写好或者

2. Kafka消费异常导致消费阻塞

问题描述:某个消息消费异常或者某个操作较为耗时,导致单个pod的消费能力下降,甚至产生阻塞。

方案:设置偏移量;开关多线程的消费策略;

2.1 设置偏移量

1. 调整偏移量:联系运维,将offset后移一位;
2. 消息补推:针对跳过的消息或某个时间段内的数据进行消息补推;
3. 如果涉及数据一致性问题,需要通过数据比对、对账等功能进行校验。

2.2 开关多线程的消费策略

参考上面的“可配置多线程的消费策略”,在发生阻塞时开启多线程消费开关。

注:需要修改代码或者在事前将多线程逻辑写好

3. Kafka消息丢失预案

问题描述:服务没有按照预期消费到kafka消息,导致业务产生问题

方案:根因分析;消息补推;

3.1 根因分析

(1) 生产端是否成功发送消费(源头丢失)

  • Broker丢失消息:Kafka为了得到更高的性能和吞吐量,将数据异步批量的存储在磁盘中,异步刷盘有肯能造成源头数据丢失;

  • Producer丢失消息:发送逻辑存在Bug,导致消息为发送成功。

解决:需要检查生产端与集群健康性;消息补发。

(2) 是否被成功消费

Consumer自动提交的机制是根据一定的时间间隔,将收到的消息进行commit。commit过程和消费消息的过程是异步的。也就是说,可能存在消费过程未成功(比如抛出异常),commit消息已经提交了。

此外,如果消费逻辑有bug,也导致消息丢失的假象。

解决:修复问题,视情况修改消费确认机制。

(3) 是否有其他服务共用了同一个消费组

多服务误用同一个消费组会导致消息一定比率或规律性丢失。

例如,创建用户的kafka消息,可能价格中心和促销服务误用了一个消费组,导致每个服务都是消费了部分消息,导致一些问题出现偶现的情况。

解决:修改配置,重启服务,各种建立的消费组;事前需要有检查是否有多个服务共用一个消费的情况(检测+比对);

3.2 消息补推

  1. 通过业务影响查询影响的数据信息;

  2. 构建kafka消息,进行消息补偿;

  3. 如果涉及数据一致性问题,需要通过数据比对、对账等功能进行校验。

针对每个对外发送的服务,生产端一般都需要有较为完善的消息补推接口,并且消费端也需要保障消息消费的幂等)

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

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

相关文章

大文件传输的好帮手Libarchive:功能强大的开源归档文件处理库

在数字化时代,文件的存储和传输对于企业的日常运作至关重要。但是,服务器中的压缩文件往往无法直接查看或预览,这给用户带来了不便。为了解决这一问题,在线解压功能的开发变得尤为重要。接下来,小编将介绍一个能够实现…

【Web后端】Tomcat简介_安装_解决乱码_idea配置

1.1 简介 tomcat是在oracle公司的ISWDK(lavaServer Web DelevopmentKit)的基础上发展起来的一个优秀的开源的servlet容器tomcat使用java语言编写。运行稳定、可靠、效率高,可以和目前 主流web服务器一起工作(如IIS、Apache、 Nginx)tomcat是Apache软件基金会(Apach…

初识指针(4)<C语言>

前言 前面的文章,已经对指针的基础概念以及运用有了初步了解,我们可以进一步探究指针比较深入的知识,下文将主要介绍:使用指针数组模拟二维数组、字符指针变量、数组指针、二维数组传参的本质、函数指针、typedef关键字等。 目录…

计算机网络课设---校园组网

需要word与.pkt文件的添加微信,备注"计网课设",搜索:_Z-Nuyoah 一、设计的目的和任务 通过课程设计,使学生理论联系实际,在实践中进一步了解计算机网络体系结构,深入理解TCP/IP参考模型,掌握各种网络工程技术和网络规划与设计,初步掌握高速局域网技术、广域…

成为计算机视觉(CV)需要掌握哪些技术知识(综述)

在CV领域,深度学习和机器学习技术发挥着至关重要的作用,它们为图像识别、目标检测、图像分割等任务提供了强大的工具和方法。本文将综述CV中需要学习的深度学习和机器学习技术。 一、深度学习技术 卷积神经网络(Convolutional Neural Netwo…

PHP 提取数组中的特定的值

需求: 前端展示: (1)之前的页面: (2)修改后的页面: 之前接口返回的数据 : 解决办法:提取tags 中的 ’约 的数组 添加到一个新的数组中去 1:一开…

Unity值类型和引用类型

我们都知道C#编程语言中,数据类型被分为了两种: 值类型引用类型 那么什么是值类型?什么是引用类型呢?它们的区别又是什么? 为了搞清楚这些问题,我们先列举一下我们开发中会碰到的值类型和引用类型。 常…

Canvas绘制图片和区域(前端使用Canvas绘制图片,并在图片上绘制区域)

简介&#xff1a;在Web开发中&#xff0c;有时候我们需要在图片上进行一些交互式操作&#xff0c;比如绘制区域、标记等。这种场景下&#xff0c;我们可以使用HTML5的<canvas>元素来实现。Canvas 是 HTML5 提供的一种图形绘制接口&#xff0c;可以通过 JavaScript 在网页…

AI应用案例:供应链平台健康状况和发展趋势分析

某供应链平台在2019年就遍布了中国320个城市&#xff0c;为2600多家企业提供超40万个品类的供应链服务。它是通过直供城市终端销售门店&#xff0c;甚至是消费者&#xff0c;最大限度保证品牌和终端的销售利益。 但是平台交易市值较大、涉及的行业较多&#xff0c;而且打破了传…

linux grep命令搜索指定路径

在Linux开发的过程中grep这个搜索命令&#xff0c;是必不可少的存在。它可以快速的搜索出来我们需要的关键字所在的位置。 有助于我们快速分析定位问题。 下面&#xff0c;分享一个简单实用的小技巧。 原始grep 最终grep grep过滤掉二进制的文件 -I选项 结论 这样子是不…

队列的实现(使用C语言)

完整代码链接&#xff1a;DataStructure: 基本数据结构的实现。 (gitee.com) 目录 一、队列的概念&#xff1a; 二、队列的实现&#xff1a; 使用链表实现队列&#xff1a; 1.结构体设计&#xff1a; 2.初始化&#xff1a; 3.销毁&#xff1a; 4.入队&#xff1a; 5.…

深入了解 Flask Request

文章目录 获取请求数据获取请求信息文件上传总结 Flask 是一个轻量级的 Python Web 框架&#xff0c;其简洁的设计和灵活的扩展性使其成为了许多开发者的首选。在 Flask 中&#xff0c;处理 HTTP 请求是至关重要的&#xff0c;而 Flask 提供了丰富而强大的 request 对象来处理…

【Linux网络编程】I/O多路转接之select

select 1.初识select2.了解select基本概念和接口介绍3.select服务器4.select特点及优缺点总结 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603;…

企业微信主体能不能修改?

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…

ansible——INVENTORY主机清单

一、Inventory主机清单 Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内 二、Inventory主机清单部署 2.1 前期准备 systemctl stop firewalld setenforce 0 yum install epel-release -y yum install…

Panasonic机器人维修|松下机械手维修过程

在我们的科技日新月异的今天&#xff0c;松下机器人已经广泛应用于各个领域&#xff0c;发挥着越来越重要的作用。然而&#xff0c;这些Panasonic机械手维修过程也是一项重要且复杂的工作。 一、准备工作 在进行松下机器人维修前&#xff0c;需要充分了解机器人的构造和工作原理…

JavaScript逆向技术

JavaScript逆向之旅&#xff1a;深入解析与实践 在数字时代&#xff0c;前端技术的迅速发展使得Web应用变得更加丰富和复杂。JavaScript&#xff0c;作为前端的核心语言&#xff0c;其安全性和隐私保护问题也逐渐浮出水面。JavaScript逆向&#xff0c;作为一种从前端代码中提取…

2022 年全国职业院校技能大赛高职组云计算赛项试卷(容器云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

高效工作之软件系统——数据结构登记表

数据结构模板 开发完软件系统后&#xff0c;往往需要进行一些登记——《软件系统数据结构登记表》 然后软件项目有60个表左右&#xff0c;难道需要手动录入&#xff0c;那肯定不可能 工欲善其事必先利其器&#xff01;go。。。同事给的模板是下图 效果图 于是想到 之前使用…

C++学习第三十一课:C++ 线程与多线程编程的应用

一、线程与多线程编程的基本概念 线程的定义 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流&#xff0c;一个进程中可以并发多个线程&#xff0c;每条线程并行执行不同的任务…