Kafka
码上见高低
纸上得来终觉浅,绝知此事要躬行
展开
-
【生产者篇】Serializer分析和源码解读.md
1、序列化作用序列化主要是用来解决数据在网络中传输的问题. 在网络中传输的数据必须全是字节。生产者需要用序列化器( Serializer )把对象转换成字节数组才能通过网络发送给Kafka ,消费者需要用反序列化器( Deserializer )把从Kafka 中收到的字节数组转换成相应的对象。在入门demo中使用的是org. apache.kafka. common. serializat...原创 2019-07-07 18:07:43 · 2056 阅读 · 0 评论 -
【生产者篇】 KafkaProducer实例化-初始化配置
1、KafkaProducer构造方法使用KafkaProducer的api之前需要得到一个KafkaProducer实例,梳理KafkaProducer的构造函数:KafkaProducer一共五个构造器://核心构造器 KafkaProducer(ProducerConfig config, Serializer<K> keySer...原创 2019-07-06 23:09:11 · 3952 阅读 · 0 评论 -
【生产者篇】 KafkaProducer实例化-核心构造方法
KafkaProducer的实例化最终都是由核心构造方法实现的。kafka的producer分为主线程和sender线程,主线程负责将消息放到缓存中,sender线程以守护线程方式运行轮询缓存进行发送消息。在KafkaProducer实例化的同时,需要实例化缓存队列RecordAccumulator,缓存队列就是主线程存放消息的。并开启sender线程,初始化Kafkaclient,就是为网...原创 2019-07-06 23:09:20 · 2093 阅读 · 0 评论 -
【生产者篇】 初始化分区器和DefaultPartitioner分区实现分析
一、分区器的初始化时机1、在KafkaProducer获取分区器, /** * 读取使用的分区器 * 分区器配置名properties.put("partitioner.class" ,"全类名") * 如果配置了将会使用用户自定义的分区器,如果用户没有自定义分区器,这里将会使用 ...原创 2019-07-06 23:09:30 · 2279 阅读 · 0 评论 -
【生产者篇】 sender线程源码分析--1
主要内容:sender线程简单介绍sender线程的初始化和开启时机初始化源码分析开启时机和运行方式源码分析总结run方法执行流程分析run方法源码Sender线程run方法图解细节补充说明1.sender线程简单介绍sender线程就是调用RecordAccumulator的api从RecordAccumulator中取出内容,请求kafka获取可用...原创 2019-07-20 19:14:02 · 1017 阅读 · 0 评论 -
【网络核心层篇】NetworkClient—初始化连接
initiateConnect方法虽然初始化了一个连接,也执行了 doConnect(socketChannel, address);方法,但是在 设置成了非阻塞I/O模式 见3, channel.connect(address);会立即返回。所以initiateConnect方法执行结束,并不代表真正的一个连接,建立,后面会在网络读写的poll方法中对连接进行检查,channel.finis...原创 2019-07-20 19:32:32 · 1853 阅读 · 0 评论 -
【网络核心层篇】NetworkClient—检查连接
Sender 线程在发送消息的的sendProducerData()方法中,会对Kafka的的每个node 进行检测是否可以发送消息,将没有就绪的node节点移除,这个时候就会调用NetworkClient的ready方法对指定的node 进行检测。1.流程图:2.源码分析:1.检测node的连接状态是否就绪可用则为true,不可用则返回false,并会初始化一个连接/** * Be...原创 2019-07-20 19:40:25 · 1327 阅读 · 0 评论 -
【数据结构篇】请求队列InFlightRequest
1.请求队列简单介绍:InFlightRequest是client的请求队列。max.in.flight.requests.per.connection配置请求队列大小,默认5,请求队列中存放的是在发送途中的请求,包括:正在发送的请求和已经发送的但还没有接收到response的请求;请求队列满了,发送消息将会发生阻塞。也就是发往同一个node的最大未响应请求数。具体实现是:sender线程在...原创 2019-07-21 00:51:24 · 3655 阅读 · 0 评论 -
【网络核心层篇】-KafkaChannel-网络读写底层实现
1.KafkaChannel简述KafkaChannel是对SocketChannel的封装,是Kafka中负责网络读写的最底层类。封装了SocketChannel,还封装了Kafka自己的认证器Authenticator。屏蔽Kafka的上层逻辑,来看KafkaChannel是如何设计的。KafkaChannel网络读写模型:Kafka-client是nio selector模型的网络通...原创 2019-07-28 01:05:54 · 1314 阅读 · 1 评论 -
【配置篇】生产者配置总览[持续补充中..]
Producer实例化是初始化了60多项生产者配置项。这里整理的配置都是从源码中整理的。持续补充中…配置项描述缺省值作用bootstrap.serversKafka服务器地址列表,host1:port1,host2:port2格式配置metadata.max.age.ms元数据有效期毫秒值5601000(5分钟)更新本地缓存的的Kafka集群数据b...原创 2019-07-28 17:02:41 · 550 阅读 · 0 评论 -
【配置篇】kafka生产者配置详细分析[全网最详细,最深度分析。持续补充中.....]
metadata.max.age.ms: metadata有效期毫秒值,默认值5分钟。metadata就是客户端保存的服务器信息。过期后会自动更新。原创 2019-07-28 23:37:00 · 2124 阅读 · 0 评论 -
【生产者篇】 KafkaProducer初探
producer包结构internals下面放的就是kafka内部使用的,下面的这些类就是跟api有关的。从上到下:BufferExhaustedException:buffer耗尽时候抛出的异常,关于kafka中异常处理和异常体系后面会单独分析。Callback:回调函数接口KafkaProducer :Produce实现类MockProducer:Produce实现类,mock数...原创 2019-07-06 23:09:01 · 1688 阅读 · 0 评论 -
1 入门demo
官方入门demopublic static void main(String[] args) { String url = "ip:9092"; String topic = "quick_start"; Properties properties = new Properties(); properties.put("key.deserializer", "or...原创 2019-07-06 23:08:52 · 1097 阅读 · 0 评论 -
7-1 序列化集成 Kryo
1、为什么使用二进制编码kafka中提供了很多内置列化器,但是在生产中我们的消息对象或者格式更为复杂,这个时候我们可以采取将消息的java对象转成json字符串,这样producer使用StringSerializer进行序列化,consumer使用StringDeserializer然后再将json转成对象,使用json有很多好处,方便操作,还有就是跨语言也方便,但是缺点就是性能太低,码流太...原创 2019-07-09 12:21:01 · 1563 阅读 · 0 评论 -
7-2 序列化集成ptotobuf
protostuff基于protobuf的序列化/反序列化,不需要编写.proto文件,方便使用。针对kryo的序列化demo,使用protostuff。在producer和consumer的配置中分别配置自定义的ProtostuffSerializer和ProtostuffDerializer即可注意使用protostuff序列化需要注意,序列化和反序列化的字段顺序问题。1、引入依赖&l...原创 2019-07-09 12:33:53 · 1436 阅读 · 0 评论 -
【生产者篇】 KafkaProducer发送消息简要流程
Kafka的Producer客户端就是完成将消息发送到Kafka服务器。完成这个功能只需要使用KafkaProducer的send方法即可。其内部原理是由两个线程共同完成,主线程和sender线程。sender线程是主线程的守护线程。主线程负责创建消对象,并将消息放在缓存,sender线程从缓存取出消息然后进行网络发送。简要流程分析:主线程:1、封装消息对象,ProducerRecord,...原创 2019-07-10 14:23:07 · 2863 阅读 · 0 评论 -
【生产者篇】拦截器源码分析
生产者拦截器可以对消息进行预处理。分析下KafkaProducer的拦截器相关源码1、拦截消息的地方调用KafkaProduer的send方法时候第一步就是拦截器对消息进行处理:public Future<RecordMetadata> send(ProducerRecord<K, V> record, Callback callback) { //拦截器处理...原创 2019-07-10 14:24:04 · 1898 阅读 · 0 评论 -
【生产者篇】 producer发送消息-追加到缓存分析
经过序列化,计算分区号之后KafkaProducer主线程调用RecordAccumulator的append方法将消息追加到缓存。并唤醒sender线程处理。流程参照博客:send方法中更新元数据源码分析KafkaProducer发送消息简要流程这里sender.wakeup()方法就是最终调用了nioSelector的wakeup方法,selector监听channel事件,会发送阻塞。...原创 2019-07-14 23:20:37 · 1926 阅读 · 0 评论 -
【生产者篇】发送消息send方法源码解读
关于更新元数据waitOnMetadata和追加消息到缓存由于内容很多。waitOnMetadata见下篇分析,RecordAccumulator会有专题分析数据结构和存取过程@Overridepublic Future<RecordMetadata> send(ProducerRecord<K, V> record, Callback callback) { ...原创 2019-07-11 09:43:52 · 2022 阅读 · 0 评论 -
【生产者篇】 send方法中更新元数据源码分析
在send方法中需要获取Cluster信息,然后计算分区的时候,如果消息没有指定分区,那么就会使用到Cluster信息用于计算分区号。所以在计算分区号之前,需要获取最新的Cluster数据但是更新元数据的具体不在这里,准确的应该叫等待元数据更新。为什么是等待呢?看源码send方法源码://....省略无关代码 //等待元数据更新:[2.1]clusterAndWaitTime = wa...原创 2019-07-11 11:39:48 · 1213 阅读 · 0 评论 -
【生产者篇】 自定义拦截器
根据send方法的源码知道,消息先进入拦截器,这里的拦截器,跟web拦截器一样,在拦截器中可以进行逻辑判断处理,可以对消息进行再次,或者统一的包装处理。也可以做一些公共行为逻辑实现:比如:1:统计消息次数,成功次数,失败次数:2:可以实现消息的统一落地(如果需要);3:可以实现类似的aop日志,成功日志,错误日志。自定义拦截器使用步骤:1: 实现ProducerInterceptor...原创 2019-07-11 12:36:43 · 1109 阅读 · 0 评论 -
写在之前
Kafka是一个优秀的发布订阅消息系统,因其高吞吐量特点被广泛运用,所以有必要对其进行研究学习。选用的版本是Kafka2.0,我对kafka运用经验不足,工程经验欠缺。所以学习kafka,对学习过程做一些总结贴出来,一方面给学习的胖友一个参考,另一方面也受着广大胖友的检验。同步GitHub地址kafka-clients-2.0.0源码注释,如果对你有帮助希望给个star。博客中发现问题可立即指...原创 2019-07-06 23:09:38 · 1138 阅读 · 0 评论