摘要: 在发送数据的流程中有一部分是要根据批次的大小申请内存,Kafka客户端使用BufferPool来实现ByteBuffer的复用,目的是减少Full Gc的可能性 BufferPool由几个重要的成员组成 free : 是一个ArrayDeque队列,其中缓存了指定大小的ByteBuffer对象 to 阅读全文
posted @ 2021-02-17 15:39 写写代码睡着了 阅读(11) 评论(0) 推荐(0)
摘要: 上一篇介绍了将数据存入RecordAccumulator 这一过程 这段代码是在高并发的情况下运行的,既然如此,就会有线程安全的问题。我们看到作者设计这段代码的时候,并没有在整个方法上加锁,而是采用分段解锁的方式,将性能提升到最高 但是不知道大家有没有注意到获取或创建队列的时候,也就是这行代码 De 阅读全文
posted @ 2020-11-04 00:57 写写代码睡着了 阅读(44) 评论(0) 推荐(0)
摘要: 本篇介绍下Kafka是如何将消息压入RecordAccumulator对象中的 RecordAccumulator 中的append方法,点进去 步骤一:getOrCreateDeque,获取或创建队列,kafka设计上将发往同一个分区的数据封装成RecordBatch对象,然后将这些对象放入一个队 阅读全文
posted @ 2020-11-02 22:55 写写代码睡着了 阅读(30) 评论(0) 推荐(0)
摘要: 本篇介绍下 kafka发送数据流程中是如何选择分区的。 点进步骤三这行代码。 我们在调用doSend()方法时会将消息封装下,可以使用指定分区的构造方法 如果我们调用上面的构造函数,指定分区编号,这里就不需要进行分区选择了,如果没有指定,kafka会有两种分区选择的方式,下面解读下这两种选择方式。 阅读全文
posted @ 2020-09-14 22:50 写写代码睡着了 阅读(57) 评论(0) 推荐(0)
摘要: 本节,浅析Sender线程拉去元数据过程 元数据是由Sender线程来完成的,首先找到Sender线程的run()方法 这里我们看到,Sender线程运行起来之后,第一件干的事就是 从Metadata里面获取Cluster对象,也就是集群元数据信息。但是假如代码第一次进来,获取到的Cluster是没 阅读全文
posted @ 2020-09-08 23:58 写写代码睡着了 阅读(28) 评论(0) 推荐(0)
摘要: 上一节介绍了发送数据的大体流程,一共分为八个步骤,本节开始解读几个重要的步骤。 步骤一:等待获取元数据(waitOnMetadata) waitOnMetadata 方法点进去 这段代码块包含一个do while循环。开始的时候,由于代码第一次进来,是获取不到元数据信息的,这时会去等待sender线 阅读全文
posted @ 2020-09-08 00:45 写写代码睡着了 阅读(25) 评论(0) 推荐(0)
摘要: 这一节,介绍下发送的流程 回到examples 包里面的生产者例子中,在初始化好生产者后,就要调用send方法发送数据了。 一直点到doSend 方法,这里面就是准备发送数据的流程了,一共分为八个步骤。 步骤一:等待更新元数据,要想发送数据,肯定要知道集群元数据信息,waitOnMetadata 方 阅读全文
posted @ 2020-09-05 23:24 写写代码睡着了 阅读(14) 评论(0) 推荐(0)
摘要: 在初始化生产者的过程中,初始化了一个元数据对象Metadata,下面解读下这个对象。 这个Metadata里面有一个Cluster 对象,这个是我们kafka集群的元数据对象,点进去看一下。 我们看到里面维护了许多数据结构,目的为了方便获取元数据信息,比如获取某个topic有几个分区、某个分区在哪台 阅读全文
posted @ 2020-09-05 22:10 写写代码睡着了 阅读(24) 评论(0) 推荐(0)
摘要: kafka版本:0.10.1.0 将kafka源码下载下来导入idea后都会看到一个examples包,这个包里面有生产者和消费者的例子,教我们如何使用,个人认为这里面的例子是我们学习源码最好的入口。 这段代码主要做了三件事: 1、初始化分区器 2、读取用户配置的retry.backoff.ms 这 阅读全文
posted @ 2020-09-03 20:03 写写代码睡着了 阅读(17) 评论(0) 推荐(0)
点击右上角即可分享
微信分享提示