Kafka的Producer和Consumer源码学习
先解释下两个概念:
high watermark (HW)
它表示已经被commited的最后一个message offset(所谓commited, 应该是ISR中所有replica都已写入),HW以下的消息都已被ISR中各个replica同步,从而保持一致。HW以上的消息可能是脏数据:部分replica写成功,但最终失败了。
Kafka Partition: 1> 均衡各个Broker之间的数据和请求压力; 2> 分摊处理不同的消费者进程; 3> 在partition内可以保证局部有序和状态记录;
Producer发送数据时,Broker的内部处理流程: a. Broker Server接到一个Producer request
b. 会先从ZK中获取该topic的metadata
c. 进而找到partition的metadata
d. 从而确定对应的partition leader
e. 接下来通过该leader partition来append log
f. 最后计算是否调整leader的High Watermark (它是ISR中所有replica的logEndOffset的最小值与leader的logEndOffset比较得出的最大值) 当然,Broker Server还要根据Producer request的需要决定是否回复ack给client;
Kafka Producer配置:
Kafka的Producer采用了 linkedBlockingQueue, 所以用户设置的batchNumMessages不能大于queueBufferingMaxMessages.
Producer线程可以设定为定期更新Topic Metadata (topic.metadata.refresh.interval.ms, 若该值为负值,则取消定期更新);但是一旦Producer遇到失败情况(partition missing or leader not available), 她会自动更新Metadata;
message.send.max.retries: Kafka有可能会出现某个partition leader暂时不可访问的情况,这个配置参数描述了Producer在此种情况下最多retry的次数。
compression.codec: 在Producer配置中,该参数指定压缩模式,默认是NoCompressionCodec(对所有Topic都不使用压缩)
compressed.topics: 在compression.codec不是NoCompressionCodec的前提下,则为指定的若干Topic执行写压缩,当compressed.topics为空时则是为所有topic执行压缩。
producer.type: sync or async
metadata.broker.list: Producer通过这个参数指定的Broker来获取Topic Metadata
partitioner.class: 关于生产者向指定的分区发送数据,通过设置partitioner.class的属性来指定向那个分区发送数据;如果自己指定必须编写相应的程序,默认是kafka.producer.DefaultPartitioner,分区程序是基于散列的键( Utils.abs(key.hashCode) % numPartitions )。
retry.backoff.ms: 设置Producer在refresh metadata之前要等待的时间 (Producer在每次retry之前都要refresh metadata, 但是可能partition的leader selection等需要一定的执行时间),默认100毫秒;
Kafka Consumer配置:
group.id: 指定consumer所属的consumer group
consumer.id: 如果不指定会自动生成
socket.timeout.ms: 网络请求的超时设定
socket.receive.buffer.bytes: Socket的接收缓存大小
fetch.message.max.bytes: 试图获取的消息大小之和(bytes)
num.consumer.fetchers: 该消费去获取data的总线程数
auto.commit.enable: 如果是true, 定期向zk中更新Consumer已经获取的last message offset(所获取的最后一个batch的first message offset)
auto.commit.interval.ms: Consumer向ZK中更新offset的时间间隔
queued.max.message.chunks: 默认为2
rebalance.max.retries: 在rebalance时retry的最大次数,默认为4
fetch.min.bytes: 对于一个fetch request, Broker Server应该返回的最小数据大小,达不到该值request会被block, 默认是1字节。
fetch.wait.max.ms: Server在回答一个fetch request之前能block的最大时间(可能的block原因是返回数据大小还没达到fetch.min.bytes规定);
rebalance.backoff.ms: 当rebalance发生时,两个相邻retry操作之间需要间隔的时间。
refresh.leader.backoff.ms: 如果一个Consumer发现一个partition暂时没有leader, 那么Consumer会继续等待的最大时间窗口(这段时间内会refresh partition leader);
auto.offset.reset: 当发现offset超出合理范围(out of range)时,应该设成的大小(默认是设成offsetRequest中指定的值):
smallest: 自动把该consumer的offset设为最小的offset;
largest: 自动把该consumer的offset设为最大的offset;
anything else: throw exception to the consumer;
consumer.timeout.ms: 如果在该规定时间内没有消息可供消费,则向Consumer抛出timeout exception;
该参数默认为-1, 即不指定Consumer timeout;
client.id: 区分不同consumer的ID,默认是group.id
Kafka Consumer如何与ZK交互:
/brokers/ids/[0]...[N-1]: N是Broker个数,每个[i]是一个Broker,里面存储着每个Broker相关的信息(ip,port,epoch等);
/brokers/topics/[topic_name]/partitions/[0]...[N-1]/state: N是这个topic的partition数目,state里存放了每个partition的leader及ISR等信息;
备注: [topic_name]这个znode本身也存储了所有partition对应的leader broker;
/consumers/[group_id]/ids/[consumer_id]/[topic0]-[topicN]: [consumer_id]是一个临时znode, 其子node是该consumer监听的topic
/consumers/[group_id]/offsets/[topic_name]/[partition_id]: [partition_id]结点中的值即为offset
/consumers/[group_id]/owners/[topic_name]: ?(会陆续补充)
ConsumerFetcherThread的内部命名:
"ConsumerFetcherThread-%s-%d-%d".format(consumerIdString, fetcherId, sourceBroker.id)
Kafka消费端如何知道从哪个partition消费,以及如何在多个消费者之间平衡对于多个partition的消费? 目前Broker Server端不会做类似处理,client端可以利用zookeeper来动态分配。(此处还有些不解)
Kafka Consumer在ZK中注册后会监听Broker变化及同组内(Consumer Group)consumer的加入或推出,从而自动实现partitions与consumers的平衡。
关于平衡算法,简单的说就是在实现平衡过程中,尽量保证一个consumer只和尽可能少的Broker维持连接。
Kafka的Producer和Consumer源码学习的更多相关文章
- RocketMQ 源码学习笔记————Producer 是怎么将消息发送至 Broker 的?
目录 RocketMQ 源码学习笔记----Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest ...
- RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?
目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest Roc ...
- Java并发包源码学习之AQS框架(三)LockSupport和interrupt
接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...
- Java并发包源码学习系列:阻塞队列BlockingQueue及实现原理分析
目录 本篇要点 什么是阻塞队列 阻塞队列提供的方法 阻塞队列的七种实现 TransferQueue和BlockingQueue的区别 1.ArrayBlockingQueue 2.LinkedBloc ...
- Java并发包源码学习系列:阻塞队列实现之LinkedTransferQueue源码解析
目录 LinkedTransferQueue概述 TransferQueue 类图结构及重要字段 Node节点 前置:xfer方法的定义 队列操作三大类 插入元素put.add.offer 获取元素t ...
- 实战录 | Kafka-0.10 Consumer源码解析
<实战录>导语 前方高能!请注意本期攻城狮幽默细胞爆表,坐地铁的拉好把手,喝水的就建议暂时先别喝了:)本期分享人为云端卫士大数据工程师韩宝君,将带来Kafka-0.10 Consumer源 ...
- Kakfa揭秘 Day6 Consumer源码解密
Kakfa揭秘 Day6 Consumer源码解密 今天主要分析下Consumer是怎么来工作的,今天主要是例子出发,对整个过程进行刨析. 简单例子 Example中Consumer.java是一个简 ...
- Dubbo源码学习--服务是如何引用的
ReferenceBean 跟服务引用一样,Dubbo的reference配置会被转成ReferenceBean类,ReferenceBean实现了InitializingBean接口,直接看afte ...
- Dubbo源码学习--注册中心分析
相关文章: Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 注册中心 关于注册中心,Dubbo提供了多个实现方式,有比较成熟的使用zookeeper 和 redis 的 ...
随机推荐
- 7 天玩转 ASP.NET MVC — 第 5 天
目录 第 1 天 第 2 天 第 3 天 第 4 天 第 5 天 第 6 天 第 7 天 0. 前言 欢迎来到第五天的学习.希望第一天到第四天的学习,你都是开心的. 1. Lab 22 - 增加 Fo ...
- ZOJ3724 Delivery(树状数组??)
题意:给你一个有向图,第一类边是从第i个点到第i+1个点的,还有多出来的m条二类边,是从u到v的,同样是有向的.然后你要处理询问,从u到v经过最多一次二类边的最短距离是多少. 题目我觉得是神题,然后看 ...
- HDU 4287 Intelligent IME(string,map,stl,make_pair)
题目 转载来的,有些stl和string的函数蛮好的: //numx[i]=string(sx); //把char[]类型转换成string类型 // mat.insert(make_pair(num ...
- 自己的gitignore文件
*.bak*.txt*.vm.gitignore#svn.svn/# built application files*.apk*.ap_ # files for the dex VM*.dex # J ...
- SSH开发实践part2:双向1-N连接配置
1 OK,上一篇已经介绍了项目开发的前期准备工作,具体内容可以参考:http://www.cnblogs.com/souvenir/p/3783686.html 按照开发步骤,我们现在已经可以开始进行 ...
- lintcode:整数排序||
题目 给一组整数,按照升序排序.使用归并排序,快速排序,堆排序或者任何其他 O(n log n) 的排序算法. 解题 归并排序 public class Solution { /** * @param ...
- iOS复杂动画之抽丝剥茧(Objective-C & Swift)
一.前言 随着开发者的增多和时间的累积,AppStore已经有非常多的应用了,每年都有很多新的APP产生.但是我们手机上留存的应用有限,所以如何吸引用户,成为产品设计的一项重要内容.其中炫酷的动画效果 ...
- Android百度地图开发03之地图控制 + 定位
前两篇关于百度地图的blog写的是,一些基本图层的展示 和 覆盖物的添加+地理编码和反地理编码. 接下来,这篇blog主要说一些关于地图控制方面的内容和定位功能. 百度地图提供的关于地图的操作主要有: ...
- Android 获取屏幕高度,宽度,状态栏高度
背景介绍: 到目前为止,android已经从1.5发展到目前的3.2,我们在写一个应用的时候,最常用到得就是获取屏幕高度,宽度,以及status bar的高度. 然而android系统变化太快了,从开 ...
- js获取滚动条距离浏览器顶部,底部的高度,兼容ie和firefox
做web开发经常会碰到需要获取浏览器的滚动条与顶部和底部的距离,然后做相应的处理动作.下面作者就如何通过js来获取浏览器滚动条距离浏览器顶部和底部的高度做一下分享,这个是同时兼容ie和firefox的 ...