深入了解Kafka【四】消费者的Offset管理
1、Offset Topic
Consumer通过提交Offset来记录当前消费的最后位置,以便于消费者发生崩溃或者有新的消费者加入消费者组,而引发的分区再均衡操作,每个消费者可能会分到不同的分区。我测试的kafka版本是:0.11.0.2,消费者往一个特殊的主题“_consumer_offset”发送消息,如图:
消息的内容包括:
fields | content |
---|---|
Key | Consumer Group, topic, partition |
Payload | Offset, metadata, timestamp |
提交到“_consumer_offset”主题的消息会根据消费组的key进行分区,一个消费组内的所有消息,都会发送到唯一的Partition。
2、Offset Commit
Offset的提交逻辑其实和普通的生产者往kafka发送数据是一样的。
2.1、Consumer
消费者启动时会为“_consumer_offset”主题创建一个内置的生产者,用于Offset数据的提交。
2.2、Broker
就是将Offset提交当成是正常的生产请求,逻辑不变。
“_consumer_offset”主题会在集群中的第一个Offset提交请求时被自动创建。
3、Offset的提交方式
Offset提交时会有两个问题:重复消费和漏消费。
- 当提交的Offset小于客户端处理的最后一条消息的Offset,会造成重复消费。
情景:先消费,后提交Offset,如果消费成功、提交失败,消费者下次获取的Offset还是以前的,所以会造成重复消费。 - 当提交的Offset大于客户端处理的最后一条消息的Offset,会造成漏消费。
情景:先提交Offset,后消费,如果提交成功、消费失败,消费者下次获取的Offset已经是新的,所以会造成漏消费。
根据具体的业务情况,选择合适的提交方式,可以有效的解决掉重复消费和漏消费的问题。
3.1、自动提交
自动提交是最简单的提交方式,通过设置参数,可以开启自动提交也可以设置提交的时间间隔。缺点就是,当消费了一些数据后,还未达到自动的提交时间,这个时候,有新的消费者加入,或者当前消费者挂掉,会出现分区再均衡操作,之后消费者重新在上一次提交的Offset开始消费,造成重复消费。虽然可以缩短自动提交间隔,但是还是无法解决这个问题。
3.2、同步提交当前Offset
关闭手动提交,可以通过同步提交接口来提交当前的Offset,虽然可以获取主动性,但是也牺牲了吞吐量,因为同步提交必然是阻塞的,而且会有重试机制。
3.3、异步提交当前Offset
使用异步提交方式,既有主动性,也可以增加kafka消费的吞吐量,没有重试机制,也解决不掉重复消费的问题。
3.4、同步和异步组合提交
正常使用的时候使用异步提交,速度快。当要关闭消费者的时候,使用同步提交,即使失败了也会一直重试,直到提交成功或者发生无法恢复的错误。不管是同步提交还是异步提交都避免不了重复消费和漏消费的问题。
3.5、提交指定的Offset
因为自动提交、同步提交与异步提交都是将最后一个Offset提交上去。通过提交指定的Offset,可以减轻重复消费和漏消费的问题,但是相应的消费端就需要复杂的业务处理,而且需要自己维护Offset。
深入了解Kafka【四】消费者的Offset管理的更多相关文章
- SparkStreaming和Kafka基于Direct Approach如何管理offset实现exactly once
在之前的文章<解析SparkStreaming和Kafka集成的两种方式>中已详细介绍SparkStreaming和Kafka集成主要有Receiver based Approach和Di ...
- 《Apache kafka实战》读书笔记-管理Kafka集群安全之ACL篇
<Apache kafka实战>读书笔记-管理Kafka集群安全之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家能看到这篇博客的小伙伴,估计你对kaf ...
- 初始 Kafka Consumer 消费者
温馨提示:整个 Kafka 专栏基于 kafka-2.2.1 版本. 1.KafkaConsumer 概述 根据 KafkaConsumer 类上的注释上来看 KafkaConsumer 具有如下特征 ...
- ActiveMQ、RabbitMQ、RocketMQ、Kafka四种消息中间件分析介绍
ActiveMQ.RabbitMQ.RocketMQ.Kafka四种消息中间件分析介绍 我们从四种消息中间件的介绍到基本使用,以及高可用,消息重复性,消息丢失,消息顺序性能方面进行分析介绍! 一.消息 ...
- Python 使用python-kafka类库开发kafka生产者&消费者&客户端
使用python-kafka类库开发kafka生产者&消费者&客户端 By: 授客 QQ:1033553122 1.测试环境 python 3.4 zookeeper- ...
- java实现Kafka的消费者示例
使用java实现Kafka的消费者 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...
- “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第四篇(用户管理功能的实现)
“MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第四篇(用户管理功能的实现) 一.前三篇的内容是否对您有帮助呢?如果有的话,请您继续关注这篇吧,这篇主要是实现”用户管理“的 ...
- Testlink1.9.17使用方法( 第四章 测试需求管理 )
第四章 测试需求管理 QQ交流群:585499566 需求规格说明书是我们开展测试的依据.首先,我们可以对项目(产品)的需求规格说明书进行分解和整理,将其拆分为多个需求,一个项目可以包含多个需求,一个 ...
- Spring集成kafka,消费者运行时内存占用会一直增长
Spring集成kafka,消费者运行时内存占用会一直增长? 20C 本人用Spring集成kafka消费者,发布运行时内存占用会一直升高,最后程序挂掉.请各位大神看看,提供解决方法 以下是我的配置文 ...
随机推荐
- Android 的Fragment组件(写完放假。。。)
今天写的有点晚,做个题目有点慢,然后搞其他事搞定就到了0点,总结下就差不多该睡了. 今天学长讲的是Fragment: 一个可以将activity拆分成几个完全独立封装的可重用的组件,每个组件有自己的生 ...
- “随手记”开发记录day11
今天,我们团队针对每个团队对我们项目的意见或建议进行了探讨,决定了接下来需要改进的地方: (1)背景图片和颜色搭配: (2)增加修改功能: (3)对功能进行更明显划分,让使用者能够更方便的使用.
- Python 写一个俄罗斯方块游戏
使用 Python 的 PyGame 库写一个俄罗斯方块游戏的逐步指南 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人 ...
- SpringMvc接收multipart/form-data 传输的数据 及 PostMan各类数据类型的区别
前段时间遇到一个问题,在spring mvc 服务端接收post请求时,通过html 表单提交的时候,服务端能够接收到参数的值.但是使用httpclient4.3构造post请求,却无法接收到参数的值 ...
- Linux学习笔记之ubuntu如何在vi中写入中文注释
点击左边设置system settings,再点击Language Suppotr 点击Remind Me Later 选择ibus 然后关闭,在终端写入ibus-setup,弹出设置框,选择INPU ...
- 基于Logistic回归和sigmoid函数的分类算法推导
此部分内容是对机器学习实战一书的第五章的数学推导,主要是对5.2节代码实现中,有一部分省去了相关的公式推导,这里进行了推导,后续会将算法进行java实现.此部分同样因为公式较多,采用手写推导,拍照记录 ...
- Loss 总结:IoU loss总结
object detection 损失:更加接近人眼的损失 what is IoU 如果两个框没有相交,根据定义,IoU=0,不能反映两者的距离大小(重合度).同时因为loss=0,没有梯度回传,无法 ...
- Vue中diff算法的理解
Vue中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DOM结 ...
- 2020-07-20:你觉得redis有什么缺点,给你改进的话你会怎么改进?
福哥答案2020-07-20: 1.由于 Redis 是内存数据库,短时间内大量增加数据,可能导致内存不够用.2.redis是单线程的,单台服务器无法充分利用多核服务器的CPU.3.遇到大量查询时容易 ...
- linux 命令行安装谷歌浏览器
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 2. yum install -y ls ...