当前位置: 首页 > news >正文

Kafka Offset 自动提交和手动提交 - 漏消费与重复消费

目录

1. 引言

2. Offset 提交方式概述

2.1 自动提交 Offset

2.2 手动提交 Offset

3. 漏消费与重复消费的问题分析

3.1 自动提交模式下的漏消费和重复消费

漏消费

重复消费

3.2 手动提交模式下的漏消费和重复消费

漏消费

重复消费

4. 自动提交与手动提交的选择

4.1 适用场景

4.2 配置建议

5. 代码示例

5.1 自动提交示例

5.2 手动提交示例

6. 结论

参考文档


1. 引言

Kafka 是当前广泛使用的分布式消息队列系统,其强大的吞吐量和可靠性使其在实时数据流处理中广受欢迎。在 Kafka 消费过程中,Offset 是一个重要的概念,它记录了每个消费组读取消息的进度。本文将详细探讨 Kafka Offset 的自动提交和手动提交模式,并分析它们可能导致的漏消费和重复消费问题。

2. Offset 提交方式概述

2.1 自动提交 Offset

在 Kafka 中,enable.auto.commit 配置项决定是否开启自动提交。当设置为 true 时,Kafka Consumer 会定期(由 auto.commit.interval.ms 配置项指定的时间间隔)自动提交当前的 Offset。自动提交的优点是实现简单,使用方便,但缺点是可能会导致漏消费或重复消费的问题。

2.2 手动提交 Offset

手动提交 Offset 是指由程序员在消费逻辑中显式地调用提交方法(如 commitSync()commitAsync())进行 Offset 提交。手动提交提供了对 Offset 更精细的控制,能够减少漏消费和重复消费的风险,但也增加了实现的复杂性。

3. 漏消费与重复消费的问题分析

3.1 自动提交模式下的漏消费和重复消费

漏消费

在自动提交模式下,Kafka 会按固定的时间间隔提交 Offset,如果在 Offset 自动提交之后但在实际消费消息之前应用崩溃或发生其他错误,可能导致该 Offset 被提交,但实际消息并未消费。这就会造成消息的漏消费。

重复消费

自动提交可能会在消息实际处理完成之前提交 Offset。如果在 Offset 提交之后但消息处理尚未完成时应用崩溃,则在重启后,Kafka 将从已提交的 Offset 开始重新消费,导致部分消息被重复消费。

3.2 手动提交模式下的漏消费和重复消费

漏消费

在手动提交模式下,如果消息处理完成但在手动提交 Offset 之前应用崩溃或发生错误,则会导致该批次消息未被提交 Offset,从而在下次消费时从上一次提交的 Offset 开始重新消费,理论上不会导致漏消费问题。

重复消费

由于手动提交模式通常在消息处理完成后提交 Offset,因此应用崩溃可能导致上一次提交的 Offset 和实际消费的消息之间出现重复,但通过精细控制可以尽量减少重复消费的风险。

4. 自动提交与手动提交的选择

4.1 适用场景

  • 自动提交:适用于对消息偶尔漏消费或重复消费容忍度较高的场景,比如一些日志数据处理,自动提交可以简化代码逻辑。
  • 手动提交:适用于对数据一致性要求较高的场景,比如金融数据处理,手动提交可以更精细地控制消费流程,减少数据误差。

4.2 配置建议

  • 若使用 自动提交,应确保 auto.commit.interval.ms 设置合理,避免过长的提交间隔导致更多的重复消费。
  • 若使用 手动提交,应使用 commitSync() 进行同步提交,确保 Offset 成功提交;或者使用 commitAsync() 提高性能,但要处理可能的失败提交。

5. 代码示例

5.1 自动提交示例

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test-group");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList("test-topic"));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());}
}

5.2 手动提交示例

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test-group");
props.put("enable.auto.commit", "false");  // 禁用自动提交
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList("test-topic"));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());}// 手动同步提交consumer.commitSync();
}

6. 结论

Kafka Offset 的自动提交和手动提交各有优缺点,选择适合的方式需要根据具体的业务场景需求来决定。自动提交适合简单场景,但容易发生漏消费和重复消费,而手动提交提供了更高的灵活性和可靠性。

相关文章:

Kafka Offset 自动提交和手动提交 - 漏消费与重复消费

目录 1. 引言 2. Offset 提交方式概述 2.1 自动提交 Offset 2.2 手动提交 Offset 3. 漏消费与重复消费的问题分析 3.1 自动提交模式下的漏消费和重复消费 漏消费 重复消费 3.2 手动提交模式下的漏消费和重复消费 漏消费 重复消费 4. 自动提交与手动提交的选择 4.1…...

Vue3父组件和子组件

子组件暴露方法给父组件&#xff0c;父组件传值 子组件 const editCalendar (value: string) > {console.log(获取父组件的值, value)};//暴露给外部调用defineExpose({editCalendar,}); 父组件 <template> <CalendarEdit ref"editRef" /> </…...

Linux 定时任务全解析

文章目录 一、Cron 服务1.1安装1.2配置文件格式1.3使用方法1.4系统级与用户级 Cron 任务区别 二、At 服务2.1安装2.2工作原理2.3使用方法 一、Cron 服务 1.1安装 在大多数 Linux 发行版中&#xff0c;Cron 服务通常已经默认安装。例如在 Ubuntu 系统中&#xff0c;可以通过以…...

XLNet——打破 BERT 局限的预训练语言模型

近年来&#xff0c;深度学习在自然语言处理&#xff08;NLP&#xff09;领域取得了革命性进展&#xff0c;其中 BERT 的出现标志着双向语言建模的强大能力。然而&#xff0c;BERT 也存在一些局限性&#xff0c;限制了其在生成任务中的表现。2019 年&#xff0c;由 Google 和 Ca…...

开源代码统计工具cloc的简单使用

一.背景 公司之前开发了个小系统&#xff0c;要去申请著作权&#xff0c;需要填写代码数量。应该怎么统计呢&#xff1f;搜索了一下&#xff0c;还是用开源工具cloc吧&#xff01;我的操作系统是windows&#xff0c;代码主要是java项目和vue项目。 二.到哪里找 可以去官方下载…...

如何创建一个项目用于研究element-plus的原理

需求&#xff1a;直接使用element-plus未封装成组件的源码&#xff0c;创建一个项目&#xff0c;可以使用任意的element-plus组件&#xff0c;可以深度研究组件的运行。例如研究某一个效果&#xff0c;如果直接在node_modules修改elment-plus打包之后的那些js、mjs代码&#xf…...

单片机进阶硬件部分_day2_项目实践

设计要求 从绘制原理图到画PCB板&#xff0c;完成智能云衣柜项目 STM32 &#xff08;Modbus&#xff09;云IOT衣物云端管理 华为PCB布线规范 基于IoT的智享家主控系统 步骤分析 需求分析 器件选型绘制原理图&#xff08;器件连接&#xff09;PCB布局、布线泪滴、铺铜、添加丝印…...

labview关于文件路径的问题

在调用文件或拆分文件的时候经常会用到拆分路径函数和创建路径函数&#xff0c;最常用的也是当前应用程序目录或者是当前VI目录。 这里我们看到应用程序目录和VI目录在同一项目中&#xff0c;应用程序目录更像是根目录&#xff0c;往下拆分成了各个VI的子目录。 接下来我们来拆…...

72项!湖北省2024年度第二批省级科技计划项目拟立项项目公示!

本期精选 SCI&EI ●IEEE 1区TOP 计算机类&#xff08;含CCF&#xff09;&#xff1b; ●EI快刊&#xff1a;最快1周录用&#xff01; 知网(CNKI)、谷歌学术期刊 ●7天录用-检索&#xff08;100%录用&#xff09;&#xff0c;1周上线&#xff1b; 免费稿件评估 免费匹配…...

神经网络问题之:梯度不稳定

梯度不稳定是深度学习中&#xff0c;特别是在训练深度神经网络时常见的一个问题&#xff0c;其本质涉及多个方面。 一、根本原因 梯度不稳定问题的根本原因在于深度神经网络的结构和训练过程中的一些固有特性。随着网络层数的增加&#xff0c;梯度在反向传播过程中会逐层累积变…...

ORACLE删不掉job,如何解决。

问题&#xff1a; 删掉 NYZSM 时出错&#xff1a; ORA-27478: 作业 “ZHY.NYZSM” 正在运行 ORA-06512: 在 “SYS.DBMS_ISCHED”, line 213 ORA-06512: 在 “SYS.DBMS_SCHEDULER”, line 657 ORA-06512: 在 line 2 1、停止作业&#xff1a; 使用DBMS_SCHEDULER.STOP_JOB过程来…...

可视化建模与UML《活动图实验报告》

你当像鸟飞往你的山。 一、实验目的&#xff1a; 1、熟悉活动图的基本功能和使用方法。 2、掌握使用建模工具软件绘制协作图的方法 二、实验环境&#xff1a; window7 | 10 | 11 EA15 三、实验内容&#xff1a; <1>绘制学生选课系统中添加课程(Add Course)用例的活动图…...

基于 MUSA 的大语言模型推理和服务框架vLLM

1. 引言​ vLLM是一个高性能且内存高效的大语言模型推理和服务框架&#xff0c;也是当前业界使用范围最广的大模型推理框架&#xff0c;截至目前github star数28.4k。该框架性能优秀&#xff0c;而且部署容易&#xff0c;使用CUDA/ROCm提供GPU加速能力。但vLLM目前不支持使用摩…...

鸿蒙网络编程系列48-仓颉版UDP回声服务器示例

1. UDP回声服务器简介 回声服务器指的是这样一种服务器&#xff0c;它接受客户端的连接&#xff0c;并且把收到的数据原样返回给客户端&#xff0c;本系列的第2篇文章《鸿蒙网络编程系列2-UDP回声服务器的实现》中基于ArkTS语言在API 9的环境下实现了UDP回声服务器&#xff0c…...

android-studio-4.2下载 、启动

下载 分享一个国内的android studio网站&#xff0c;可以下载SDK和一些Android studio开发工具 https://www.androiddevtools.cn/ 启动 JAVA_HOME/app/zulu17.48.15-ca-jdk17.0.10-linux_x64/ /app5/android-studio-home/android-studio-ide-201.6568795-linux-4.2C1/bin/s…...

深度学习day2-Tensor 2

六 Tensor常见操作 Tensor&#xff1a;多维数组&#xff0c;用于存储和操作数据 1 获取元素值 data.item():单个元素tensor转为python数值 import torch #标量 xtorch.tensor(1) print(x.item()) #一阶 xtorch.tensor([100]) print(x.item()) #如果输入的数据超过1个&#…...

【Android踩过的坑】14.小米系统TTS无法生效的问题

【Android踩过的坑】14.小米系统TTS无法生效的问题 解决办法&#xff1a; 在AndroidManifest.xml中添加&#xff1a; <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"…...

RabbitMQ实现异步下单与退单

前言&#xff1a; 在电商项目中的支付模块也是一个很重要的模块&#xff0c;其中下订操作以及退订操作就是主要的操作。其次的下单是同步下单&#xff0c;也就是第三方支付、数据库扣减、积分增加、等等其他业务操作&#xff0c;等待全部执行完毕后向用户返回成功响应请求。对…...

鸿蒙NEXT开发案例:随机数生成

【引言】 本项目是一个简单的随机数生成器应用&#xff0c;用户可以通过设置随机数的范围和个数&#xff0c;并选择是否允许生成重复的随机数&#xff0c;来生成所需的随机数列表。生成的结果可以通过点击“复制”按钮复制到剪贴板。 【环境准备】 • 操作系统&#xff1a;W…...

nwjs崩溃复现、 nwjs-控制台手动操纵、nwjs崩溃调用栈解码、剪切板例子中、nwjs混合模式、xdotool显示nwjs所有进程窗口列表

-1. nwjs在低版本ubuntu运行情况 ubuntu16.04运行nw-v0.93或0.89报错找不到NSS_3.30、GLIBC_2.25 uname -a #Linux Asus 4.15.0-112-generic #113~16.04.1-Ubuntu SMP Fri Jul 10 04:37:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux cat /etc/issue #Ubuntu 16.04.7 LTS \n \l…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...