Kafka Producer源码简述
接着上文kafka的简述,这一章我们一探kafka生产者是如何发送消息到消息服务器的。
代码的入口还是从
kafkaTemplate.send开始

最终我们就会到
org.springframework.kafka.core.KafkaTemplate#doSend方法
这里的关键就是
org.apache.kafka.clients.producer.Producer#send(org.apache.kafka.clients.producer.ProducerRecord<K,V>, org.apache.kafka.clients.producer.Callback)

我们再一路点击下去,一直到
org.apache.kafka.clients.producer.KafkaProducer#doSend方法

这里将步骤分为五步
1.更新Metadata,Metadata用于存储部分topic数据
2.将发送内容序列化
3.如果我们有多个分区的话,在这里会根据算法选择相应的分区
4.向accumulator写入数据,accumulator是一种ConcurrentMap<TopicPartition, Deque<RecordBatch>> batches;结构,在这里对发送数据做零时缓存
5.缓存的够多了,唤醒线程发送数据。
所以看到这里我们就明白了,kafka不是直接将数据发送到服务器。而是缓存到内存中,知道大于batchsize才去做发送
接下来我们看下sender线程做了什么
直接来到
org.apache.kafka.clients.producer.internals.Sender#run(long)

1.连接的获取,
org.apache.kafka.clients.NetworkClient#initiateConnect

具体的connect代码如下

首先与kafka serve端建立了一个non blocking 的SocketChannel,然后将该channel注册到一个java.nio.channels.Selector上面,并注册OP_CONNECT事件。
接下来,我们再看下消息的发送
首先调用
client.send(request, now);
这个方法最终会调用
org.apache.kafka.common.network.KafkaChannel#setSend
为每个request注册
OP_WRITE事件

同时把send传递进来
接下来调用
this.client.poll(pollTimeout, now);

这个的调用链是
org.apache.kafka.common.network.Selector#poll----> org.apache.kafka.common.network.Selector#pollSelectionKeys--->

这里的
key.isWritable()
就是我们上文注册写事件,当所有的都准备好了,我们调用channel将消息发送到服务端

到这里我们就知道了kafka发送消息的大致流程。本文并没有对细节深入,只想对kafka做出快速的了解。
Kafka Producer源码简述的更多相关文章
- kafka producer源码
producer接口: /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor l ...
- Kafka Producer源码解析一:整体架构
一.Producer整体架构 Kafka Producer端的架构整体也是一个生产者-消费者模式 Producer线程调用send时,只是将数据序列化后放入对应TopicPartition的Deque ...
- kafka producer 源码总结
kafka producer可以总体上分为两个部分: producer调用send方法,将消息存放到内存中 sender线程轮询的从内存中将消息通过NIO发送到网络中 1 调用send方法 其实在调用 ...
- kafka C客户端librdkafka producer源码分析
from:http://www.cnblogs.com/xhcqwl/p/3905412.html kafka C客户端librdkafka producer源码分析 简介 kafka网站上提供了C语 ...
- Kakfa揭秘 Day7 Producer源码解密
Kakfa揭秘 Day7 Producer源码解密 今天我们来研究下Producer.Producer的主要作用就是向Kafka的brokers发送数据.从思考角度,为了简化思考过程,可以简化为一个单 ...
- Kafka Eagle 源码解读
1.概述 在<Kafka 消息监控 - Kafka Eagle>一文中,简单的介绍了 Kafka Eagle这款监控工具的作用,截图预览,以及使用详情.今天笔者通过其源码来解读实现细节.目 ...
- kafka 0.8.1 新producer 源码简单分析
1 背景 最近由于项目需要,需要使用kafka的producer.但是对于c++,kafka官方并没有很好的支持. 在kafka官网上可以找到0.8.x的客户端.可以使用的客户端有C版本客户端,此客户 ...
- 高吞吐量的分布式发布订阅消息系统Kafka之Producer源码分析
引言 Kafka是一款很棒的消息系统,今天我们就来深入了解一下它的实现细节,首先关注Producer这一方. 要使用kafka首先要实例化一个KafkaProducer,需要有brokerIP.序列化 ...
- 读Kafka Consumer源码
最近一直在关注阿里的一个开源项目:OpenMessaging OpenMessaging, which includes the establishment of industry guideline ...
随机推荐
- C#代码总结01---如何清空页面上所有文本框的内容。(用于录入后的清空)
/// <summary> /// 清空页面上所有TextBox的内容.用于录入后的清空 /// </summary> /// <param name="top ...
- 计蒜客 方程的解数 dfs
题目: https://www.jisuanke.com/course/2291/182237 思路: 来自:https://blog.csdn.net/qq_29980371/article/det ...
- 1.3 正则表达式和python语言-1.3.7 匹配任何单个字符
1.3.7 匹配任何单个字符 (2018-05-08) 点号(.)不能匹配一个换行符\n 或者非字符,也就是说,一个空字符串 搜索一个真正的句点(小数点), 而我们通过使用一个反斜线对句点的功能进行转 ...
- NOI2017总结
时光剥离你我像一袭华美衣衫 却要被追悔爬满 退役之战,去得匆匆,看得蒙蒙. 第三次全国赛,曾经的APIO初二选手也走到了时间的尽头. 第一次走向全国舞台的激动与忐忑,第一次在大赛中失利的沮丧与绝望,第 ...
- centos7 安装python3.7.11 笔记
安装python依赖包yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-deve ...
- 用generator改写ajax
function request(url) { // this is where we're hiding the asynchronicity, // away from the main code ...
- 循环结构for
教程:高能:语句结构都是由关键字开头,用冒号结束! 一:语句结构 for <variable> in <sequence>: <statements>else ...
- [shell] if语句用法
bash中如何实现条件判断?条件测试类型: 整数测试 字符测试 文件测试 一.条件测试的表达式: [ expression ] 括号两端必须要有空格 [[ expres ...
- CFUpdate高速模式下出现Error #2038提示的解决方案
使用CFUpdate上传文件,在IE模式下是正常的,切换到高速模式下出现提示Error #2038错误,文件无法上传. 向作者了解到需要设置challs_flash_update函数中的a.url为绝 ...
- redhat 6 红帽6 Linux 网络配置
[root@ORAMYSQL ~]# cd /etc/sysconfig/network-scripts/ 切换到网卡配置目录 [root@ORAMYSQL network-scripts]# vi ...