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(消费者)相关推荐

  1. kafka consumer消费者 offset groupID详解

    kafka consumer:消费者可以从多个broker中读取数据.消费者可以消费多个topic中的数据. 因为Kafka的broker是无状态的,所以consumer必须使用partition o ...

  2. Apache Kafka Consumer 消费者集

    1.目标 在我们的上一篇文章中,我们讨论了Kafka Producer.今天,我们将讨论Kafka Consumer.首先,我们将看到什么是Kafka Consumer和Kafka Consumer的 ...

  3. 关于Kafka 的 consumer 消费者手动提交详解

    前言 在上一篇 Kafka使用Java实现数据的生产和消费demo 中介绍如何简单的使用kafka进行数据传输.本篇则重点介绍kafka中的 consumer 消费者的讲解. 应用场景 在上一篇kaf ...

  4. kafka 主动消费_Kafka核心API——Consumer消费者

    Consumer之自动提交 在上文中介绍了Producer API的使用,现在我们已经知道如何将消息通过API发送到Kafka中了,那么现在的生产者/消费者模型就还差一位扮演消费者的角色了.因此,本文 ...

  5. kafka之Consumer消费者基本概念

    概念 消费者 消费者(Consumer)即读取Kafka集群中某些topic消息的程序,kafka中消费者分为两种类型: 消费者组 (consumer group) 独立消费者 (standalong ...

  6. 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 ...

  7. kafka的Consumer 消费者(六)

    Kafka 的消费方式   消息队列主要有两个消费方式:pull(拉)模式 和 push(推)模式   pull(拉)模式 consumer采用从broker中主动拉取数据,push(推)模式 bro ...

  8. Kafka consumer group位移0ffset重设

    本文阐述如何使用Kafka自带的kafka-consumer-groups.sh脚本随意设置消费者组(consumer group)的位移.需要特别强调的是, 这是0.11.0.0版本提供的新功能且只 ...

  9. Kafka设计解析(四):Kafka Consumer解析--转

    原文地址:http://www.infoq.com/cn/articles/kafka-analysis-part-4?utm_source=infoq&utm_campaign=user_p ...

  10. kafka consumer配置拉取速度慢_Kafka分区分配策略(Partition Assignment Strategy)

    众所周知,Apache Kafka是基于生产者和消费者模型作为开源的分布式发布订阅消息系统(当然,目前Kafka定位于an open-source distributed event streamin ...

最新文章

  1. 携手中国电信、中国联通,华为正式发布首个5G超级刀片站 A+P 2.0天线商用网络
  2. pytorch优化器与学习率设置详解
  3. python代码格式-Python 代码格式
  4. linux 小白启航之路-搭建linuxDHCP中继服务器
  5. boost::hana::span用法的测试程序
  6. day10 Pyhton学习
  7. html 为什么ul不撑开,给li设置float浮动属性之后,无法撑开外层ul的问题。
  8. Laravel核心解读--Database(四) 模型关联
  9. OpenShift 4 - DevSecOps Workshop (2) - 运行一个基于Tekton的Pipeline示例
  10. Batch入门教程(1)
  11. 代码评审系统 ReviewBoard 和 Gerrit
  12. 这次是90城的数据!中国90座城市建筑物屋顶矢量数据集(2020)
  13. 在线计算机表格制作,excel表格制作,教您excel怎么制作表格
  14. 深度学习进阶之路 - 从迁移学习到强化学习
  15. 酚酸靶向助力组合消毒剂在新鲜农产品中的应用研究
  16. BZOJ 3426 CodeChef/CHANGE
  17. 六面蚂蚁金服,唬住了面试官要了 30K;其实 Java 面试也没那么难
  18. checkra1n越狱错误79_苹果越狱工具 checkra1n 更新:支持 iOS 13.4.1
  19. [转载]JavaMail API简介
  20. Remove Duplicate

热门文章

  1. python 标签字体大小_这文档动画,怎么用 Python 实现的?
  2. Spring Cloud的Eureka Server(注册中心)在程序启动的时候报错:Cannot execute request on any known server
  3. java中final语句_Java中使用非final变量的不可访问语句
  4. 第四章 ---- 事务RedisTemplate
  5. vue ---- filter(vue2才有)
  6. air英语怎么读_如何用英语发音“Macbook Air”
  7. centos7下安装mysql5.6_CentOS7安装后MySQL5.6如何配置MySQL5.6呢?
  8. 关于python的垃圾回收机制_Python中的垃圾回收机制
  9. new ext.toolbar控制按钮间距_新闻速递 | APT携新品金属按钮亮相宝博会,圈粉无数!...
  10. 用Math.random()方法生成随机数