Kafka-consumer(消费者)
kafka的消费者叫做consumer,不应该把它理解成消息的接收者,这与rabbit mq不一样,因为kafka的consumer是主动去kafka代理服务器(broker)去拉自己想要的消息的,而不是服务器推送过来的,下图是consumer与partition的关系
从图中可以看出左下角还有一个partition,这是kafka自带的partition,专门用来存放主题为_consumer_offset的消息,下面开始叙述上图中的过程
1.消费者c1从p1中消费index=0的消息,消息内容是“我”
2.消费者c1获取到该消息之后,c1身份切换,从消费者,变成发送者
3.消费者c1(此时做为发送者)向主题_consumer_offset发送一条消息,消息的内容是key=c1_T1_p1,其实就是消费者id+主题+分区id,value=0
4.图中左下角的partition接到c1发送的消息之后,持久化到本地,其内容的含义是:消费者c1从分区p1中消费主题T1的消息,已经消费到了index=0的位置
目的是当c1宕机,重启之后,还能继续从它应该消费的位置消费
那么了解了上述之后,当c1去p2消费一条消息的时候,图是下面这样的
其中黄色圆圈里的内容,就是消费完p2的消息之后,对c1和p2消费关系的一个映射
好了,消费者与partition之间的关系就介绍完毕,但是本文只演示了一个消费者,多个消费者的情况是一样的,只是kafka有消费组这个概念
消费组
消费组是为了解决重复消费而引入的概念,只要是分布式中间件,都需要解决重复消费的问题
如果多个消费者属于同一个消费组,那么同一个消费组中,只能有一个消费者从某个partition中消费消息,下面是一个简单的示意图
当consumer1从第一条数据开始消费的时候,那么和它同一个组的consumer2,将永远没有机会消费
顺序消费: 根据上述特性,我们可知,要想顺序消费,一个consumer,只能消费一个partition,且一个主题的消息,只能往一个partition中推消息,也就是说,将kafka用成rabbit mq的样子,一般情况使用kafka是不会用到顺序消费的,除非作为面试题用用而已,因为kafka的业务场景和设计理念,就注定了它应该作为高吞吐量的数据分析用,而不是高保证消息丢失不丢是的中间件
消息回溯消费
1.可以从头消费
2.也可以从指定的offset消费
3.可以从指定的时间点消费(本质也是找到指定时间点的offset)
上述三种的命令和java api以后再补,因为我个人觉得,重要的是知识面,而不是那些命令或者api,知识面广了,很多东西你自然而然就知道该怎么做,查阅资料很简单,但是如果知识面不足,那么查资料都不知道从何开始
消费者auto commit
auto_commit_interval_ms参数:自动提交间隔时间,比方设置100毫秒,如果100毫秒内消费了50条数据,那么offset就会增加50
两个索引文件
和commit log文件同文件夹有两个index文件,一个是索引查找,一个是time index,配合这俩index定位到commit log文件的大概位置(二分查找),然后再顺序IO查找
重平衡(Rebalance)
kafka的Rebalance指的是,同一个组的多个消费者,均衡的消费多个partition,比方说有10个partition,5个consumer,那么应该每个consumer,消费两个partition,这样达到均衡消费,假设突然有一个consumer宕机了,那么多出来两个partition,这两个多出来的partition将如何处理,这就是Rebalance
heartbeat_interval参数:consumer和broker的心跳时间
session_timeout参数:如果多久没收到心跳,broker就会踢掉consumer
Rebalance机制由broker leader触发,就是多个broker中的leader,也叫总控制器controller,kafka的broker启动的时候,假设是好几个一起启动的,它们都会往zk中创建一个叫controller的节点,并写节点数据,因为zk是原子操作,所以谁最先写成功,谁就是总控制器controller
Rebalance有三种策略
1.range:就是根据一种算法,但是我觉得这个算法不是很重要,假设n=分区数/消费者数,假设m=分区数%消费者数,前m个消费者每个分配n+1个分区,剩下的消费者每个分配n个分区
假设12345个分区,c1c2两个消费者,则c1分到123,c2分到45
日记:我觉得采用hash不是更好么?
2.round-robin:轮询分配,类似斗地主发牌,将第1个分区给第1个消费者,第2个分区给第2个消费者,依次类推
日记:这个方式与range方式得到的分区数量是相同的,不同的地方在于分区顺序不一样,既然数量相同,不同的Rebalance策略那有什么意义?
3.sticky:能不动就不动的原则,假设原来有p1p2p3,三个分区,分别在c1c2c3上,现在c3宕机了,那么p1依然在c1上,p2依然在c2上,将p3分配给c1
Kafka-consumer(消费者)相关推荐
- kafka consumer消费者 offset groupID详解
kafka consumer:消费者可以从多个broker中读取数据.消费者可以消费多个topic中的数据. 因为Kafka的broker是无状态的,所以consumer必须使用partition o ...
- Apache Kafka Consumer 消费者集
1.目标 在我们的上一篇文章中,我们讨论了Kafka Producer.今天,我们将讨论Kafka Consumer.首先,我们将看到什么是Kafka Consumer和Kafka Consumer的 ...
- 关于Kafka 的 consumer 消费者手动提交详解
前言 在上一篇 Kafka使用Java实现数据的生产和消费demo 中介绍如何简单的使用kafka进行数据传输.本篇则重点介绍kafka中的 consumer 消费者的讲解. 应用场景 在上一篇kaf ...
- kafka 主动消费_Kafka核心API——Consumer消费者
Consumer之自动提交 在上文中介绍了Producer API的使用,现在我们已经知道如何将消息通过API发送到Kafka中了,那么现在的生产者/消费者模型就还差一位扮演消费者的角色了.因此,本文 ...
- kafka之Consumer消费者基本概念
概念 消费者 消费者(Consumer)即读取Kafka集群中某些topic消息的程序,kafka中消费者分为两种类型: 消费者组 (consumer group) 独立消费者 (standalong ...
- 4.2.10 Kafka源码剖析, 阅读环境搭建, broker启动流程, topic创建流程, Producer生产者流程, Consumer消费者流程,
目录 4.1 Kafka源码剖析之源码阅读环境搭建 4.1.1 安装配置Gradle 4.1.2 Scala的安装和配置 4.1.3 Idea配置 4.1.4 源码操作 4.2 Kafka源码剖析之B ...
- kafka的Consumer 消费者(六)
Kafka 的消费方式 消息队列主要有两个消费方式:pull(拉)模式 和 push(推)模式 pull(拉)模式 consumer采用从broker中主动拉取数据,push(推)模式 bro ...
- Kafka consumer group位移0ffset重设
本文阐述如何使用Kafka自带的kafka-consumer-groups.sh脚本随意设置消费者组(consumer group)的位移.需要特别强调的是, 这是0.11.0.0版本提供的新功能且只 ...
- Kafka设计解析(四):Kafka Consumer解析--转
原文地址:http://www.infoq.com/cn/articles/kafka-analysis-part-4?utm_source=infoq&utm_campaign=user_p ...
- kafka consumer配置拉取速度慢_Kafka分区分配策略(Partition Assignment Strategy)
众所周知,Apache Kafka是基于生产者和消费者模型作为开源的分布式发布订阅消息系统(当然,目前Kafka定位于an open-source distributed event streamin ...
最新文章
- 携手中国电信、中国联通,华为正式发布首个5G超级刀片站 A+P 2.0天线商用网络
- pytorch优化器与学习率设置详解
- python代码格式-Python 代码格式
- linux 小白启航之路-搭建linuxDHCP中继服务器
- boost::hana::span用法的测试程序
- day10 Pyhton学习
- html 为什么ul不撑开,给li设置float浮动属性之后,无法撑开外层ul的问题。
- Laravel核心解读--Database(四) 模型关联
- OpenShift 4 - DevSecOps Workshop (2) - 运行一个基于Tekton的Pipeline示例
- Batch入门教程(1)
- 代码评审系统 ReviewBoard 和 Gerrit
- 这次是90城的数据!中国90座城市建筑物屋顶矢量数据集(2020)
- 在线计算机表格制作,excel表格制作,教您excel怎么制作表格
- 深度学习进阶之路 - 从迁移学习到强化学习
- 酚酸靶向助力组合消毒剂在新鲜农产品中的应用研究
- BZOJ 3426 CodeChef/CHANGE
- 六面蚂蚁金服,唬住了面试官要了 30K;其实 Java 面试也没那么难
- checkra1n越狱错误79_苹果越狱工具 checkra1n 更新:支持 iOS 13.4.1
- [转载]JavaMail API简介
- Remove Duplicate
热门文章
- python 标签字体大小_这文档动画,怎么用 Python 实现的?
- Spring Cloud的Eureka Server(注册中心)在程序启动的时候报错:Cannot execute request on any known server
- java中final语句_Java中使用非final变量的不可访问语句
- 第四章 ---- 事务RedisTemplate
- vue ---- filter(vue2才有)
- air英语怎么读_如何用英语发音“Macbook Air”
- centos7下安装mysql5.6_CentOS7安装后MySQL5.6如何配置MySQL5.6呢?
- 关于python的垃圾回收机制_Python中的垃圾回收机制
- new ext.toolbar控制按钮间距_新闻速递 | APT携新品金属按钮亮相宝博会,圈粉无数!...
- 用Math.random()方法生成随机数