Kafka 中有这样一个概念消费者组,所有我们去订阅 topic 和 topic 交互的一些操作我们都是通过消费者组去交互的。

在 consumer 端设置了消费者的名字之后,该客户端可以对多个 topic 进行订阅。我们也可以通过 group-id 来识别是谁在消费消息,或者在消费哪些组的消息。

发挥 consumer 最大的效果就是和 broker 的 topic 下的 partitions 数相等。

做到一个 parititons 分配一个独立的 consumer 去消费能达到最高效果,比如我们给一个 topic 分配 20 个 partitions 高峰期间最好我们就有 20个 consumer 在消费它们。你说我们要是分配 25个可以吗?也可以,但是会有 5个 consumer 在空闲。

这里还有一个需要注意的地方,如果我们使用消费者组订阅了多个 topic ,那么我们消费者组需要的消费者数量是所有 topic partitions 之合才能达到满载效果这个需要特别注意。

老版本的 consumer 把 offset 存储在 zk 上,但是后来发现在大规模部署的生产环境中,这样做会让 zk 随着 kafka 集群规模的增长而线性增长。所以后面新版本的 consumer 是把 offset 存储在 自己集群的 topic 的 __consumer_offsets 位移主题中。

下面我们来详细聊下新版 offset 存储以及 __consumer_offsets 的用途。新版本的位移管理机制就是将位移数据一条条提交到 __consumer_offsets 中。

常规位移消息的格式包含三部分<group_id, topic_name, partition_no> 用于说明自己是来自哪个消费组,消费 topic 名称和所消费的 partition 号。

另外还有两种消息:

1. 用于注册新的 consumer group 的消息。

2. 用于删除过期 group 位移或者删除 group 的消息。一旦某个 consumer group 下的所有 consumer 实例都停止了,而且它们的位移数据都已经被删除的时候, kafka 会向位移主题的对应分区写入 tombstone 消息,墓碑消息表明要彻底删除这个 group 的信息。

默认情况下 kafka __consumer_offsets 会在第一个 consumer 创建的时候自动创建,默认是 50 个 partitions 。

consumer 端有参数来控制是否自动提交位移,并且多久提交一次位移:

enable.auto.commit = True # 默认为 True
auto.commit.interval.ms = # 默认 5s python 多线程会为其提交一次位移

位移的数据会提交得越来越多,就需要整理。

Kafka 使用 Compact 来整理过期的消息。Compact 策略会用于来删除位移主题中的过期消息,避免消息的无限膨胀。

这里有一张来自官网的图片来描述 compact 算法究竟在做什么

上面我们说了 key 是大概是由 <group_id, topic_name, partition_no> 谁在哪个主题哪个分区 的消费位置,那么这个消费位置会一直更新,因为我们一直在消费,所以属于这个 group_id 的每个 partitions 的消息位置会一直变化。也就是 value 会一直被更新那么 compact 算法就能基于相同的 key 对前面老旧的消息进行清理。想了解其详细算法可以参考 reference 对 log compaction 的源码解析。

Kafka 提供专门的后台线程定期巡检待 Compact 的主题,我们可以通过查看 kafka 日志 log-cleaner.log 获得一些信息

[-- ::,] INFO Cleaner : Beginning cleaning of log __consumer_offsets-. (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Building offset map for __consumer_offsets-... (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Building offset map for log __consumer_offsets- for segments in offset range [, ). (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Offset map for log __consumer_offsets- complete. (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Cleaning log __consumer_offsets- (cleaning prior to Mon Jul :: CST , discarding tombstones prior to Sat Jul :: CST )... (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Cleaning segment in log __consumer_offsets- (largest timestamp Fri May :: CST ) into , retaining deletes. (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Cleaning segment in log __consumer_offsets- (largest timestamp Sun Jul :: CST ) into , retaining deletes. (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Swapping in cleaned segment for segment(s) , in log __consumer_offsets-. (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Cleaning segment in log __consumer_offsets- (largest timestamp Mon Jul :: CST ) into , retaining deletes. (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Swapping in cleaned segment for segment(s) in log __consumer_offsets-. (kafka.log.LogCleaner)
[-- ::,] INFO [kafka-log-cleaner-thread-]:
Log cleaner thread cleaned log __consumer_offsets- (dirty section = [, ])
100.0 MB of log processed in 3.4 seconds (29.3 MB/sec).
Indexed 100.0 MB in 2.8 seconds (35.4 Mb/sec, 82.8% of total time)
Buffer utilization: 0.0%
Cleaned 100.0 MB in 0.6 seconds (170.4 Mb/sec, 17.2% of total time)
Start size: 100.0 MB (,, messages)
End size: 0.0 MB ( messages)
100.0% size reduction (100.0% fewer messages)
(kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Beginning cleaning of log __consumer_offsets-. (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Building offset map for __consumer_offsets-... (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Building offset map for log __consumer_offsets- for segments in offset range [, ). (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Offset map for log __consumer_offsets- complete. (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Cleaning log __consumer_offsets- (cleaning prior to Mon Jul :: CST , discarding tombstones prior to Sun Jul :: CST )... (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Cleaning segment in log __consumer_offsets- (largest timestamp Mon Jul :: CST ) into , retaining deletes. (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Cleaning segment in log __consumer_offsets- (largest timestamp Mon Jul :: CST ) into , retaining deletes. (kafka.log.LogCleaner)
[-- ::,] INFO Cleaner : Swapping in cleaned segment for segment(s) , in log __consumer_offsets-. (kafka.log.LogCleaner)
[-- ::,] INFO [kafka-log-cleaner-thread-]:
Log cleaner thread cleaned log __consumer_offsets- (dirty section = [, ])
1.8 MB of log processed in 0.2 seconds (11.5 MB/sec).
Indexed 1.8 MB in 0.1 seconds (13.3 Mb/sec, 86.5% of total time)
Buffer utilization: 0.0%
Cleaned 1.8 MB in 0.0 seconds (84.8 Mb/sec, 13.5% of total time)
Start size: 1.8 MB (, messages)
End size: 0.0 MB ( messages)
99.9% size reduction (99.8% fewer messages)
(kafka.log.LogCleaner)

下一篇会来重点谈一谈 rebalance 的问题,和手动提交 offset python 版本的实操。

Reference:

https://time.geekbang.org/column/article/105112 geektime 专栏 kafka 核心技术与实战-15 消费者组到底是什么

https://time.geekbang.org/column/article/105473 geektime 专栏 kafka 核心技术与实战-16 揭开神秘的“位移主题”面纱

https://time.geekbang.org/column/article/105473 geektime 专栏 kafka 核心技术与实战-17 消费者组重平衡能避免吗

https://github.com/dpkp/kafka-python/issues/948  KIP-62 / KAFKA-3888: Allow consumer to send heartbeats from a background thread

https://github.com/dpkp/kafka-python/pull/1266/files  KAFKA-3888 Use background thread to process consumer heartbeats

https://segmentfault.com/a/1190000007922290  Kafka Log Compaction 解析

Kafka 消费者到底是什么 以及消费者位移主题到底是什么(Python 客户端 1.01 broker)的更多相关文章

  1. 我们使用 Kafka 生产者在发消息的时候我们关注什么(Python 客户端 1.01 broker)

    之前使用 Kafka 的客户端消费者比较多一点,而且也是无脑订阅使用也没有深入了解过具体的参数.总的来说使用不够细节. 这次公司项目活动期间暴露非常多的问题,于是有了这篇文章. 首先我们来拆解一下 K ...

  2. kafka Poll轮询机制与消费者组的重平衡分区策略剖析

    注意本文采用最新版本进行Kafka的内核原理剖析,新版本每一个Consumer通过独立的线程,来管理多个Socket连接,即同时与多个broker通信实现消息的并行读取.这就是新版的技术革新.类似于L ...

  3. kafka 消费组功能验证以及消费者数据重复数据丢失问题说明 3

    原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94 背景 上一篇文章记录了kafka的副本机制和容错功能的说明,本篇则主要在上一篇文章的基础上 ...

  4. Hadoop生态圈-Kafka的新API实现生产者-消费者

         Hadoop生态圈-Kafka的新API实现生产者-消费者 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  5. Hadoop生态圈-Kafka的旧API实现生产者-消费者

    Hadoop生态圈-Kafka的旧API实现生产者-消费者 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.旧API实现生产者-消费者 1>.开启kafka集群 [yinz ...

  6. 深入了解Kafka【五】Partition和消费者的关系

    1.消费者与Partition 以下来自<kafak权威指南>第4章. 假设主题T1有四个分区. 1.1.一个消费者组 1.1.1.消费者数量小于分区数量 只有一个消费者时,消费者1将收到 ...

  7. Kafka 幂等生产者和事务生产者特性(讨论基于 kafka-python | confluent-kafka 客户端)

    Kafka 提供了一个消息交付可靠性保障以及精确处理一次语义的实现.通常来说消息队列都提供多种消息语义保证 最多一次 (at most once): 消息可能会丢失,但绝不会被重复发送. 至少一次 ( ...

  8. 053 kafka自带的生产者与消费者测试

    1.命令 2.启动生产者 bin/kafka-console-producer.sh --topic beifeng --broker-list linux-hadoop01.ibeifeng.com ...

  9. Kafka之--python-kafka测试kafka集群的生产者与消费者

    前面两篇博客已经完成了Kafka的搭建,今天再来点稍高难度的帖子. 测试一下kafka的消息消费行为.虽然,kafka有测试的shell脚本可以直接测试,但既然我最近在玩python,那还是用pyth ...

随机推荐

  1. Dijkstra堆优化+邻接表

    Dijkstra算法是个不错的算法,但是在优化前时间复杂度太高了,为O(nm). 在经过堆优化后(具体实现用的c++ STL的priority_queue),时间复杂度为O((m+n) log n), ...

  2. js对象及函数(四)

    一.对象1.函数对象的创建方法一:使用new构造函数去创建构造函数对象eg: var obj = new Object(); //向对象里面添加属性或方法 obj.name = 'nzc'; obj. ...

  3. 嵌入式应用开发第四阶段-基于rk3399的视频监控系统

    一.需求分析 伴随着嵌入式技术.图像处理技术和无线网络传输技术的发展,传统模拟视频监控系统和基于PC的远程视频监控系统由于自身的不足,已经无法满足现代社会应用中不断涌现出来的新需求,于是基于嵌入式技术 ...

  4. 深入理解jvm--性能监控工具

    1.jvm监控工具介绍 1.1.jconsole JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动. 1.2.启动jconsole 通过JD ...

  5. Flask入门到放弃(五)—— 蓝图

    转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10980094.html 蓝图 Blueprint 模块化 随着flask程序越来越复杂,我们需要对 ...

  6. 基于cmake编译glew

    cmake已经成为了C/C++开源项目的主流构建工具.glew也提供了cmake的脚本,但用cmake编译glew容易采坑:glew的github上的代码,无论是master分支还是glew-2.1. ...

  7. Python 3.6 版本-使用Pytesseract 模块进行图像验证码识别

    环境: (1) win7 64位 (2) Idea (3) python 3.6 (4) pip install pillow <&nbsp>pip install pytesse ...

  8. 云计算与大数据实验:Hbase shell基本命令操作

    [实验目的] 1)了解hbase服务 2)学会启动和停止服务 3)学会进入hbase shell环境 [实验原理] HBase是一个分布式的.面向列的开源数据库,它利用Hadoop HDFS作为其文件 ...

  9. 如何为SUSE配置IP地址,网关和DNS

    方法一.在命令行中配置.输入: ifconfig eht0 9.111.66.96 netmask 255.255.255.0 up route add default gw 9.111.66.1 方 ...

  10. 算法图解(python3版本)--读后感

    本想写详细点,但入门书籍没啥干货,一天就看完了,简单介绍下: 大纲--两方面 一.介绍算法是什么:算法的作用,判断算法效率高低的指标 ①通过编程解决问题的思路,或者说程序本身就是算法,算法作用是为了提 ...