企业宣传展示网站开发论文/百度域名注册查询
Kafka生产常见问题分析与总结
消息丢失
- 生产者
- acks = 0
- 不需要等待任何Broker确认收到消息的回复就可以继续发消息
- 性能最高,但是最容易丢消息,对于数据丢失不敏感的场景可以使用,如大数据统计报表
- 不需要等待任何Broker确认收到消息的回复就可以继续发消息
- acks = 1
- 只要等待Broker中的leader成功写入数据成功就可以继续发消息
- 如果follower没有成功备份数据而此时leader刚好挂了,就会丢消息
- 只要等待Broker中的leader成功写入数据成功就可以继续发消息
- acks = -1 或 all
- 等待Broker中的leader、follower都写入成功才可以继续发消息
- 只要保证有一个副本存活就不会丢消息,一般使用在金融场景,当然如果配置副本只有一个也可能会丢消息跟acks=1情况类似
- 等待Broker中的leader、follower都写入成功才可以继续发消息
- acks = 0
- 消费者
- 如果消费者配置的是自动提交,恰好此时消费服务挂了,没有处理完的所有数据,这样就导致了数据丢失,下次也消费不到了
重复消费
- 生产者
- 发送消息如果配置了重试机制,比如网络抖动时间过长导致发送端发送超时,实际Broker可能已经接受到消息,但发送方会重发消息
- 消费者
- 如果消费消息配置了自动提交,刚拉取了一批处理了一部分,但是尚未提交,服务挂了,下次重启时又会拉取到相同的一批数据重复处理,一般情况下
消费端会进行幂等性处理
- 如果消费消息配置了自动提交,刚拉取了一批处理了一部分,但是尚未提交,服务挂了,下次重启时又会拉取到相同的一批数据重复处理,一般情况下
消费乱序
- 如果发送端配置重试机制,Kafka不会等之前那条消息完全发送成功才去发送下一条消息,这样可能会出现发送了1、2、3三条消息,第1条消息超时了,后面2条消息发送成功,然后再重试发送第1条消息,这时Broker端分区存入的消息顺序为2、3、1,所以是否需要配置重试机制得根据业务去定,当然也可以用同步发送的模式去发送并且acks≠0,这样也能保证消息从发送到消费是全链路有序的
- 发送端的消息
发送模式
- 发后即忘
- 不关心消息是否成功到达,对返回结果不做任何判断处理,这种方式注重吞吐量,但是无法保证消息的可靠性
- 同步
- 消息发送出去之后,关心消费端是否成功接受,只有成功了才能继续下一条
- 异步
- 在发送消息的同时通过指定的回调函数去进行消费端的响应处理
- 发后即忘
- 发送端的消息
注意
: Kafka保证全链路消息顺序消费需要从生产端开始- 方案一: 将所有有序消息发送到同一个分区,然后使用一个消费者去消费,但是这种性能较低
- 方案二: 可以在消费者端接受到消息后将需要保证顺序消费的几条消息发送到内存队列(可以整多个),一个内存队列安排一个线程去顺序处理
消息积压
-
线上有时因为生产端发送消息速度过快或者消费端消费过慢,可能会导致Broker积压大量未消费的消息
- 一般情况下可以通过增加当前topic的分区将消息拆分到更多的分区中去,同时增加对应的消费者去进行消费
- 消费者数 = 分区数
- 如果积压了百万级消息需要进行紧急处理,可以修改消费端程序,将其收到的消息快速转发到其他topic(可以设置多个分区),然后再启动多个消费者去同时消费新增topic多个分区下消息
- 一般情况下可以通过增加当前topic的分区将消息拆分到更多的分区中去,同时增加对应的消费者去进行消费
-
由于消息数据格式变动或消费端程序存在问题,导致消费端消费失败,可能会导致Broker积压大量未消费的消息
- 可以将这些消费失败的消息转发到其他队列(类似死信队列),后面再慢慢分析死信队列中的消息去进行问题处理
延迟消息
- 延时队列存储的对象是延时消息,所谓的延时消息就是发送出去之后,消费端需要等待某个特定的时间才能进行获取到该消息进行消费
应用场景
- 超时订单
- 订单完成多长时间后通知进行评价
实现思路
- 发送延时消息先把消息按照不同的延迟时间段发送到指定的topic中,然后通过定时任务进行轮询消费这些topic,查看消息是否到期,如果时间到了就把这些消息发送到具体业务的topic中
注意
- 如果用定时任务执行,对项目性能也是一种考验,而且会有一定的延迟,如果要保证时间偏差在2min左右,这样会导致执行过于频繁,所以比建议使用Kafka去实现延迟消息,建议使用RocketMQ、RabbtMQ
- 发送延时消息先把消息按照不同的延迟时间段发送到指定的topic中,然后通过定时任务进行轮询消费这些topic,查看消息是否到期,如果时间到了就把这些消息发送到具体业务的topic中
消息回溯
- 如果觉得某段时间对已消费消息的结果存在质疑,比如代码存在问题,当修复之后,可以指定offset将过去的消息重新消费一次
消息传递保障
- at most once(最多收到一次)
- 生产端使用 acks = 0
- at least lonce(至少收到一次)
- 生产端使用 acks = -1 || all
- exactly once(收到一次)
- at least once 加上消费端增加幂等性处理,也可以使用Kafka生产者的幂等性来实现
- Kafka生产者的幂等性
- 因为生产端重试导致消息重复发送,Kafka的幂等性可以保证重复发送的消息只接受一次,只需要在生产端参数开启即可
- Kafka生产者的幂等性
- at least once 加上消费端增加幂等性处理,也可以使用Kafka生产者的幂等性来实现
Kafka的事务
- Kafka的事务不同于RocketMQ,RocketMQ是保障本地事务(比如数据库)与MQ消息发送的事务一致性,
Kafka的事务主要保障一次发送多条消息的事务一致性(要么同时成功,要么同时失败)
,一般在Kafka流式计算场景较多
生产问题场景汇总
如何保证消息不丢失
生产端发送消息到Broker不丢失
- 生产端配置
- acks = 0
- 不需要等待任何Broker确认收到消息的回复就可以继续发消息
- 性能最高,但是最容易丢消息,对于数据丢失不敏感的场景可以使用,如大数据统计报表
- acks = 1
- 只要等待Broker中的leader成功写入数据成功就可以继续发消息
- 如果follower没有成功备份数据而此时leader刚好挂了,就会丢消息
- 只要等待Broker中的leader成功写入数据成功就可以继续发消息
- acks = -1 或 all
- 等待Broker中的leader、follower都写入成功才可以继续发消息
- 只要保证有一个副本存活就不会丢消息,一般使用在金融场景,当然如果配置副本只有一个也可能会丢消息跟acks = 1情况类似
- 等待Broker中的leader、follower都写入成功才可以继续发消息
- acks = 0
- 对于生产端只要使用acks = 1 || all 即可,生产端发送消息后可以拿到Broker的反馈去进行判断是否发送成功,再根据是否需要重发
- 生产端配置
Broker端保存消息不丢失
- 合理优化刷盘频率,防止服务异常崩溃造成消息未刷盘
- Kafka的消息是先写入操作系统的页缓存中,然后再刷盘写入硬盘,页缓存中的消息断电即丢失,Kafka不支持写一条刷一次盘的同步机制,只能通过调整刷盘频率提升消息安全,另外需要配置多备份因子,避免单点消息丢失,配置好备份因子之后,Kafka会给每个分区分配多个备份分区,这些分区会尽量平均分配到多个Broker上,当出现故障时也能进行选举,继续向外提供服务
- 合理优化刷盘频率,防止服务异常崩溃造成消息未刷盘
消费端防止异步处理丢失消息
- 消费者端由于有消息重试机制,正常情况下不会丢消息,每次消费处理一批消息,需要在处理完之后给Brocker进行应答,提交当前消息offset,Broker进行应答后,会推进本地日志的offset记录,如果Broker没有接到应答,Broker会重新向一个消费者组的消费者推送消息,最终保证消息不丢失,消费端采用手动提交offset的方式,相比自动提交更容易掌握提交offset的时机
- 消费端唯一要注意的是,不能进行异步处理业务逻辑,因为如果业务逻辑异步进行,而消费者已经同步提交了offset,如果业务逻辑出现异常失败了,此时Broker已经收到的消费者应答,后续不会再重新推送消息,造成业务层面的消息丢失
消息积压如何处理
业务运行正常的情况下
- 如果只是因为消费端处理消息过慢造成积压,可以增加对应topic的分区数,将消息拆分到更多的分区中,然后增加同比例的消费者数,另外再发送消息的时候,尽量要保证各个分区之间的数据分布均衡,可以调整生产端的分区策略,让后续更多的消息分配到新增的分区里,或新开一个topic,配置更多的分区以及对应的消费者数,然后启动一批消费者(充当搬运工),将消息从旧topic转发到新topic中去
- 分区数 = 消费者数
业务运行异常的情况下
- 如果是因为消费端业务问题导致积压,影响了程序正常运行,比如消费者序列化失败、业务处理异常,可以采用一种降级的方案,先启动一个消费者将topic下的消息转发到其它队列里(类似于死信队列),然后后续再进行分析以及问题处理
如何保证消息顺序
如何保证生产端发送到分区消息有序
- 第一种
- 一个topic配置一个分区,这样牺牲吞吐量保证全局有序
- 第二种
- 通过定制生产端的分区器,将消息分配到同一个分区
- 可以满足一些要求局部有序的场景,比如订单相关的多条消息但是不要求所有消息有序,就可以通过自定义分区器处理
- 通过定制生产端的分区器,将消息分配到同一个分区
- 第一种
分区中的消息有序后,如何保证消费端消费顺序有序
- 基于分区中消息的局部有序性,由于Kafka消费端拉取消息都是并行拉取多个批次的消息进行处理,所以无法保证串行消费,如果非要实现此功能,可以将消息按照业务独立性收集到对应的内存队列中,进行特定的排序进行处理
- 对于RocketMQ中提供了顺序消息,实现原理是先锁定一个MesageQueue(类似分区),消费完这个队列之后再锁定下一个队列进行消费
- 基于分区中消息的局部有序性,由于Kafka消费端拉取消息都是并行拉取多个批次的消息进行处理,所以无法保证串行消费,如果非要实现此功能,可以将消息按照业务独立性收集到对应的内存队列中,进行特定的排序进行处理
相关文章:

Kafka生产常见问题分析与总结
Kafka生产常见问题分析与总结 消息丢失 生产者 acks 0 不需要等待任何Broker确认收到消息的回复就可以继续发消息 性能最高,但是最容易丢消息,对于数据丢失不敏感的场景可以使用,如大数据统计报表 acks 1 只要等待Broker中的leader成功写…...

重温MySQL
mysql 是什么 mysql 就是一个软件,专门用来管理文件的软件 关系型数据库:采用二维表结构组织和管理数据,并且规定了表和表间数据的关系. 表是由行和列构成,列包含一组命名的属性(也称字段),行包含一条记录.行和列的交集称为数据项 (也称字段值). 如何操作数据库 那就是用sq…...

构造函数,原型,实例,类的关系整理
视频来源js原型链、构造函数和类_哔哩哔哩_bilibili 如视频所说,构造函数的prototype指向原型,实例化的对象的__proto__指向原型,原型通过constructor指向构造函数,正如class里面的constructor方法就相当于Person构造函数一样&am…...

[极客挑战2019]HTTP
这道题考察的是http请求头字段的含义和使用; 具体如下 Referer:来源地址 User-Agent:客户端配置信息:浏览器类型、版本、系统类型等 X-Forwarded-For:代理地址,即数据发出的地址 开始解题:(对我这初学者真的烧脑&a…...

发布 rust 源码包 (crates.io)
rust 编程语言的包 (或者 库, library) 叫做 crate, 也就是软件中的一个组件. 一个完整的软件通常由多个 crate 组成, rust 编译器 (rustc) 一次编译一整个 crate, 不同的 crate 可以同时并行编译. rust 官方有一个集中发布开源包的网站 crates.io. 发布在这上面的 crate 可以…...

jQuery 基础、选择器和筛选器
【一】JQuery基础 【1】什么时Jquery (1)定义 jQuery是一个流行的JavaScript库,旨在简化JavaScript编程和处理HTML文档的任务。它提供了一组易于使用的功能和方法,可以加快开发速度并提高跨浏览器兼容性。一款轻量级的JS框架 …...

网络原理-UDP/TCP协议
协议 在网络通信中,协议是非常重要的一个概念,在下面,我将从不同层次对协议进行分析. 应用层 IT职业者与程序打交道最多的一层,调用系统提供的API写出的代码都是属于应用层的. 应用层中有很多现成的协议,但是更多的,我们需要根据实际情况来进行制作自定义协议. 自定义协议…...

C语言——实用调试技巧——第2篇——(第23篇)
坚持就是胜利 文章目录 一、实例二、如何写出好(易于调试)的代码1、优秀的代码2、示范(1)模拟 strcpy 函数方法一:方法二:方法三:有弊端方法四:对方法三进行优化assert 的使用 方法五…...

broom系列包: 整理模型输出结果
broom包 说明 tidy、augment和glance函数的输出总是一个小tibble。 输出从来没有行名。这确保了您可以将它与其他整洁的输出组合在一起,而不用担心丢失信息(因为R中的行名不能包含重复)。 有些列名保持一致,这样它们就可以跨不同的模型进行组合。 tidy(…...

Spring Boot 参数校验机制原理以及如何实现一个自定义校验注解
Spring Boot 参数校验原理 Spring Boot 提供了一种方便的参数校验机制,借助于 JSR-303(Bean Validation)规范,通过在方法参数上添加校验注解来实现参数校验。下面是 Spring Boot 参数校验的基本原理: JSR-303 标准注解…...

长短期记忆神经网络
目录 LSTM 神经网络架构 分类 LSTM 网络 回归 LSTM 网络 视频分类网络 更深的 LSTM 网络 网络层 分类、预测和预报 序列填充、截断和拆分 按长度对序列排序 填充序列 截断序列 拆分序列 指定填充方向 归一化序列数据 无法放入内存的数据 可视化 LSTM 层架构 …...

解决vscode每次git pull/push都需要输入账号密码
git如何设置用户名 邮箱 密码 //设置用户 git config --global user.name "xxx"//设置邮箱 git config --global user.email "xxxxxx.com"//设置密码 git config --global user.password "xxxxx"解决每次git pull/push操作都需要输入密码 git …...

Rancher实用篇-使用rancher,部署微服务应用
说到rancher,我们必须先了解一下k8s 一、k8s简介 Kubernetes(通常简写为 K8s)是一个开源的容器管理系统,由Google于2014年发起,并在2015年贡献给Cloud Native Computing Foundation (CNCF)进行维护。它基于Borg项目的…...

爬取m3u8视频
网址:https://www.bhlsm.com/cupfoxplay/609-3-1/ 相关代码: #采集网址:https://www.bhlsm.com/cupfoxplay/609-3-1/ #正常视频网站:完整视频内容 # pip install pycryptodomex #流媒体文件:M3U8(把完整的…...

抖音视频抓取软件的优势|视频评论内容提取器|批量视频下载
抖音视频抓取软件在市场上的优势明显: 功能强大:我们的软件支持关键词搜索抓取和分享链接单一视频提取两种方式,满足用户不同的需求。同时,支持批量处理数据,提高用户获取视频的效率。 操作简单:我们的软件…...

apidoc接口文档的自动更新与发布
文章目录 一、概述二、环境准备三、接口文档生成1. 下载源码2. 初始化3.执行 四、文档发布五,配置定时运行六,docker运行 一、概述 最近忙于某开源项目的接口文档整理,采用了apidoc来整理生成接口文档。 apidoc是一个可以将源代码中的注释直…...

Oracle EBS R12.1 FA 批量计划外折旧
在资产工作台上可以进行单个资产的计划外折旧,如果进行批量计划外折旧的话就需要进行开发客户化form或者webadi 进行数据上载后调用FA 标准API了 以下是标准API的demo示例 DECLAREl_trans_rec FA_API_TYPES.trans_rec_type; l_asset_hdr_rec FA_API_TYPES.asset_hdr…...

15.3 基于深度学习的WiFi指纹低成本地点识别
文献来源:Nowicki M, Wietrzykowski J. Low-effort place recognition with WiFi fingerprints using deep learning[C]//Automation 2017: Innovations in Automation, Robotics and Measurement Techniques 1. Springer International Publishing, 2017: 575-584. 摘要 使…...

Git基本操作(1)
Git基本操作(1) 初始化git本地仓库git本地仓库配置git config user.name 和git config user.emailgit config --unset user.name和git config --unset user.emailgit config --global 认识工作区,暂存区,版本库更深层次理解 git a…...

k8s-helm部署应用 19
Helm部署nfs-client-provisioner(存储类): 预先配置好外部的NFS服务器 部署 Helm部署nginx-ingress应用: 添加下载ingress 拉取 解开并修改 部署 测试 回收 helm部署metrics-server: 清除之前的metrics部署 下载…...

OGG-00918 映射中缺少键列 id.
2024-02-23 14:54:49 INFO OGG-02756 从线索文件获取了表 GISTAR.PXPH_PON_ROUTE 的定义。. The following columns did not default because of type mismatches: id OGG-00918 映射中缺少键列 id. 目标端有字段ID,由于mysql自增,所以只能是b…...

QT_day4
1.思维导图 2. 输入闹钟时间格式是小时:分钟 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);id startTimer(1000);flag1;speecher new QTextT…...

Spring Boot应用集成Actuator组件以后怎么自定义端点暴露信息
一、 前言 在平时业务开发中,我们往往会在spring Boot项目中集成Actuator组件进行系统监控,虽然Actuator组件暴露的端点信息已经足够丰富了,但是特殊场景下,我们也需要自己暴露端点信息,此时应该怎么操作呢࿱…...

C# CAD备忘录
Document doc Application.DocumentManager.MdiActiveDocument; Database db doc.Database; Editor ed doc.Editor; 1、获取打开cad文件-文件路径 string fileName db.Filename;//文件名 输出结果 fileName “L:\目录\200401.dwg” 2、获取打开cad文件-文件名称 string fi…...

【数据结构】排序(2)
目录 一、快速排序: 1、hoare(霍尔)版本: 2、挖坑法: 3、前后指针法: 4、非递归实现快速排序: 二、归并排序: 1、递归实现归并排序: 2、非递归实现归并排序: 三、排序算法…...

HarmonyOS开发行业前景就业分析与实例解析
HarmonyOS的简介 鸿蒙系统(HarmonyOS)是华为公司自主研发的一种全场景分布式操作系统,旨在为各种设备提供统一的开发和运行环境。它的编程基础主要建立在多种技术和语言之上,包括鸿蒙系统的核心框架和应用程序开发框架。 本章将…...

Elasticsearch:创建自定义 ES Rally tracks 的分步指南
作者:Alejandro Snchez 按照这个综合教程学习如何制作个性化的 Rally tracks ES Rally 是什么?它的用途是什么? ES Rally 是一个用于在 Elasticsearch 上测试性能的工具,允许你运行和记录比较测试。 做出决策可能很困难&#x…...

5分钟JavaScript快速入门
目录 一.JavaScript基础语法 二.JavaScript的引入方式 三.JavaScript中的数组 四.BOM对象集合 五.DOM对象集合 六.事件监听 使用addEventListener()方法添加事件监听器 使用onX属性直接指定事件处理函数 使用removeEventListener()方法移除事件监听器 一.JavaScript基础…...

如何使用IP代理解决亚马逊账号IP关联问题?
亚马逊账号IP关联问题是指当同一个IP地址下有多个亚马逊账号进行活动时,亚马逊会将它们关联在一起,从而可能导致账号被封禁或限制。 为了避免这种情况,许多人选择使用IP代理。 IP代理为什么可以解决亚马逊IP关联问题? IP代理是…...

opencv之cvScalar
CV_INLINE CvScalar cvScalar( double val0, double val1 CV_DEFAULT(0), double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0)) { CvScalar scalar; scalar.val[0] val0; scalar.val[1] val1; scalar.val[2] val2; scalar.val[3] val3; return scalar; } 该函数的…...