大数据技术之 Kafka (第 3 章 Kafka 架构深入 ) Kafka 消费者

3.3.1 消费方式 

consumer 采用 pull(拉)模式从 broker 中读取数据。 
push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由 broker 决定的。
它的目标是尽可能以最快速度传递消息,但是这样很容易造成 consumer 来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而 pull 模式则可以根据 consumer 的消费能力以适当的速率消费消息。 
pull 模式不足之处是,如果 kafka 没有数据,消费者可能会陷入循环中,一直返回空数据。针对这一点,Kafka 的消费者在消费数据时会传入一个时长参数 timeout,如果当前没有数据可供消费,consumer 会等待一段时间之后再返回,这段时长即为 timeout

3.3.2 分区分配策略 

一个 consumer group 中有多个 consumer,一个 topic 有多个 partition,所以必然会涉及到 partition 的分配问题,即确定那个 partition 由哪个 consumer 来消费。 

Kafka 有两种分配策略,一是 RoundRobin,一是 Range。 

1)RoundRobin (轮询)按照组来消费

分区分配策略之RoundRobin

使用轮询的策略优点:就是一个消费者组多个消费者直接消费消息最多相差1个

缺点:使用轮询的策略有一个问题,当一个消费者组订阅的是多个topic主题,假设有一个消费者组consumergroup(consumerA订阅了主题topic1和consumerB主题topic2)consumerA消费topic1,consumerB消费topic2 ,这看起来似乎没有问题,使用轮询的策略会将消费者组订阅的主题当成一个整体。但是topic1和topic2各有三个partition分区,在kafka内部有一个TopicAndPartition这个类会将topic1和topic2的partition进行排序,假设两个经过排序之后顺序{topic1partition0,topic2partition0,topic2partition1,topic1partition2,topic1partition1,topic2partition2}   然后consumerA和consumerB轮询的拉去消息,这样consumerA就会将topic2的消息给拉取消费了这样是不是有问题?

所以使用轮询策略条件的前提:就是一个消费者组里消费者订阅的主题是一样的,只有consumerA和consumerB都订阅了topic1和topic2,这样使用轮询的方式才不会有问题

2)Range  (范围)默认的消费方式  按主题的方式给消费者(谁订阅了我就给谁消费)

      分区分配策略之Range

范围range是按照范主题划分的,一个主题7个分区 3个消费者  7除以3除不尽就会分布不均,消费者1消费前topic1的前三个分区,后面两个消费者消费topic1的4和5分区   6和7分区就给消费者3消费,这种情况看起来也没有什么问题?

缺点:假设消费者他们订阅了2个主题topic1和topic2  都是7个分区 ,由于是按主题划分的所以,消费者1就分到了topic1和topic2的1、2、3分区这样消费者1就被分到了6个分区,消费者2和消费者3只分到了4个分区,随着订阅的主题越来越多,这样消费者1和其他消费者相差越来越大,就不均衡了 

思考一个问题:消费者消费消息什么时候重新分配?

当消费者个数发生变的时候,

1,假设topic1有6个分区  三个消费者A、B、C,不管用什么策略分配,假设C负责消费partition4和partition5,突然C挂掉了,这个时候partition4和partition5需不需要消费,答案当然是要,那怎么消费?当然是重新分配

2,假设topic1有6个分区  三个消费者A、B、C、D,当消费者A服务起来的时候6个分区都分配给了A,当B起来的时候重新分配,当C起来时候也会重新分配,消费者A、B、C都分配到了2个partition,当第四个消费者D加进来的时候,会怎么办?还是上面那句话,消费者个数发生变化的时候,就会触发分区分配策略重新分配

总结:当消费者个数发生变的时候,消费者个数可以增多或者减少,甚至可以增多至比分区数还多的时候,照样会重新分配,只是有些消费者可能被分配不到

3.3.3 offset 的维护 

由于 consumer 在消费过程中可能会出现断电宕机等故障,consumer 恢复后,需要从故障前的位置的继续消费,所以 consumer 需要实时记录自己消费到了哪个 offset,以便故障恢复后继续消费。 

Kafka 0.9 版本之前,consumer 默认将 offset 保存在 Zookeeper 中,从 0.9 版本开始,consumer 默认将 offset 保存在 Kafka 一个内置的 topic 中,该 topic 为__consumer_offsets。 
1)修改配置文件 consumer.properties

exclude.internal.topics=false

2)读取 offset

0.11.0.0 之前:
bin/kafka-console-consumer.sh --topic __consumer_offsets zookeeper backup01:2181 --formatter "kafka.coordinator.GroupMetadataManager\$OffsetsMessageFormatter" --consumer.config config/consumer.properties from-beginning 
0.11.0.0 之后版本(含): 
bin/kafka-console-consumer.sh --topic __consumer_offsets zookeeper backup01:2181 --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --consumer.config config/consumer.properties frombeginning 

但是在新版本中

[root@backup01 kafka_2.12-2.4.1]# bin/kafka-console-consumer.sh --topic __consumer_offsets zookeeper backup01:2181 --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --consumer.config config/consumer.properties frombeginning
Missing required argument "[bootstrap-server]"

那我们不能用zookeeper了

[root@backup01 kafka_2.12-2.4.1]# bin/kafka-console-consumer.sh --topic __consumer_offsets --bootstrap-server backup01:9092 --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --consumer.config config/consumer.properties frombeginning

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最活跃FPGA论坛推荐社区

http://forums.xilinx.com/ Xilinx User Community Forums(Xilinx用户交流社区)http://www.openhw.org/ 中国首个开放源码硬件社区http://xilinx.eetrend.com/ 电子创新网赛灵思中文社区http://bbs.elecfans.com/forum.php 电子发烧友社区(电子技术论坛)…

大数据技术之kafka (第 3 章 Kafka 架构深入 ) offset讲解

新版的 Kafka 使用一个选举出来的 controller 来监听 zookeeper,其他 node 再去和 controller 通信,这么做的目的是为了减少 zookeeper 的压力。bootstrap-servers 会自动发现其他 broker,这也是 bootstrap 的含义 前面我们讲到了消费者&…

创建线程的三种方式

第一种,用Thread子类创建 Thread thread new Thread(){ Overridepublic void run() {while(true){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("1---->" Thread.currentThread().getName())…

大数据技术之kafka (第 3 章 Kafka 架构深入 ) 消费者组案例

1)需求:测试同一个消费者组中的消费者,同一时刻只能有一个消费者消费。 2)案例实操 (1)在 backupo01、backupo02 上修改/usr/local/hadoop/kafka/kafka_2.12-2.4.1/config/consumer.properties 配置 文件…

Easyui弹出窗口在iframe中弹出被当前iframe遮罩的问题(解决方法)

例如我们点击一个按钮&#xff0c;然后弹出我们需要的Window控件窗口。 1 //点击按钮2 var _testWindow window.top.$(testWindow);3 $(#testButton).click(function(){4 if(_testWindow.length < 0) {5 _testWindow window.top.$("<div idtestWin…

JDK1.8中String类的intern()方法学习

jdk1.8字符串常量池是位于堆中&#xff1b; 在jdk1.8中使用如下指令时会同时在堆中和常量池&#xff08;前提是常量池中还没有该对象&#xff09;中创建字符串对象&#xff0c;但是s是指向堆中。 String s new String("HELLO"); 如下方法会判断常量池中是否存在s,…

sfs2x 连接 mongodb

void initMongodb() {Mongo mongo;try {trace("\ninitMongodb\n");mongo new Mongo("localhost", 10011);DB db mongo.getDB("yourdb");// 从Mongodb中获得名为yourColleection的数据集合&#xff0c;如果该数据集合不存在&#xff0c;Mongodb…

大数据技术之kafka (第 3 章 Kafka 架构深入 ) 高效读写数据

1&#xff09;顺序写磁盘 Kafka 的 producer 生产数据&#xff0c;要写入到 log 文件中&#xff0c;写的过程是一直追加到文件末端&#xff0c; 为顺序写。官网有数据表明&#xff0c;同样的磁盘&#xff0c;顺序写能到 600M/s&#xff0c;而随机写只有 100K/s。这 与磁盘的机…

设计模式参考博客

http://www.cnblogs.com/zhenyulu/category/6930.html 吕震宇的博客园&#xff0c;关于设计模式介绍的比较全面。很值得学习的博客转载于:https://www.cnblogs.com/wangzihao/archive/2012/05/23/2514485.html

大数据技术之kafka (第 3 章 Kafka 架构深入) Zookeeper 在 Kafka 中的作用

Kafka 集群中有一个 broker 会被选举为 Controller&#xff0c;负责管理集群 broker 的上下线&#xff0c;所有 topic 的分区副本分配和 leader 选举等工作。 Controller 的管理工作都是依赖于 Zookeeper 的。 以下为 partition 的 leader 选举过程&#xff1a; Leader选举流…

SQLServer优化二

建立合理的索引,避免扫描多余数据&#xff0c;避免表扫描&#xff01;几百万条数据&#xff0c;照样几十毫秒完成查询。关于SQL查询效率&#xff0c;100w数据&#xff0c;查询只要1秒&#xff0c;与您分享&#xff01; 查询效率分析&#xff1a; 子查询为确保消除重复值&#x…

大数据技术之kafka (第 3 章 Kafka 架构深入) Kafka 事务

Kafka 从 0.11 版本开始引入了事务支持。事务可以保证 Kafka 在 Exactly Once 语义的基础上&#xff0c;生产和消费可以跨分区和会话&#xff0c;要么全部成功&#xff0c;要么全部失败 3.6.1 Producer 事务 为了实现跨分区跨会话的事务&#xff0c;需要引入一个全局唯一的 T…

JasperReport里面的Demo

1. alterdesign 该例子演示了报表编译后&#xff0c;在报表展现的时候如何动态的控制其中的元素比如让某一个矩形变色或其他 2. antcompile 演示如何让 ant 来编译 3. chart 演示了如何在报表中添加图像&#xff0c;JasperReport是用Scriptlet的方式往报表中添加图像&#xff0…

LinkedList源码阅分析

LinkedList里面涉及到的一些操作&#xff0c;非常细致&#xff0c;以避免出现的空指针&#xff0c;理解后对于其优点与确定会有一个更加整体的认识吧。 继承关系图(对比ArrayList) 元素的存储结构 在LinkedList中&#xff0c;每一个元素都是Node存储&#xff0c;Node拥有一个存…

Windows Azure Marketplaces上的Bing Search API可用啦!

Windows Azure Marketplace上的Bing Search API 现在可用啦&#xff01;通过此服务&#xff0c;你可以嵌入web、图像、新闻和视频搜索结果&#xff0c;以及相关的搜索和拼写建议来创建独特的应用程序和服务。 你也可以将数据集里的信息通过标准化的数据服务整合到应用程序中&am…

取消选中目标CALL

事先在游戏里选中一个怪物bp send,回到游戏里,按ESC&#xff0c;OD断下来,复制 返回到 elementc.072AFDD8 005869B2 返回到 elementc.005869B2 来自 elementc.0058E8A0072AFDEC 00588B1F 返回到 elementc.00588B1F 来自 elementc.00586980072AFE28 005A7346 返回到 el…

《深入理解java虚拟机》第1章 走近Java

1.6实战:自己编译JDK 想要一探JDK内部的实现机制&#xff0c;最便捷的路径之一就是自己编译- -套JDK,通过阅读和跟踪调试JDK源码去了解Java技术体系的原理&#xff0c;虽然门槛会高一点&#xff0c;但肯定会比阅读各种书籍、文章更加贴近本质。另外&#xff0c;JDK中的很多底层…

【XDA汉化组编写】Android软件汉化/精简/去广告/优化教程 FAQ

* 引用、转载请注明出处&#xff1a;XDA智能手机论坛-bbs.xda.cn-iKira&#xff01; http://bbs.xda.cn/thread-10968699-1-1.html* 汉化其实不难&#xff0c;难的是持之以恒&#xff0c;祝各位机友学有所得。转载于:https://www.cnblogs.com/dongzhiquan/archive/2012/05/30/2…

《深入理解java虚拟机》第2章 Java内存区域与内存溢出异常

Java与C之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”&#xff0c;墙外面的人想进去&#xff0c;墙里面的人却想出来。 2.1 概述 https://blog.csdn.net/q5706503/article/details/84640762 对于从事C、C程序开发的开发人员来说&#xff0c;在内存管理领域&#…

管理学习(2)——职场中最重要的四件事

职场中最重要的四件事职场的核心精髓可以概括为职场中最重要的三件事&#xff0c;它们分别是&#xff1a;职场第一要务、职业化、职场的本质。 1.这三件事与身处职场的我们到底有什么关系呢&#xff1f; 就让我用三句话概括一下&#xff1a; 职场第一要务决定了我们在职场上的…