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做出快速的了解。




转载于:https://www.cnblogs.com/xmzJava/p/9536351.html

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

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

相关文章

原来搞单片机也可以面向对象

摘要&#xff1a;在看别人单片机程序时&#xff0c;你也许是奔溃的&#xff0c;因为全局变量满天飞&#xff0c;不知道哪个在哪用了&#xff0c;哪个表示什么&#xff0c;而且编写极其不规范。自己写单片机程序时&#xff0c;也许你也是奔溃的。总感觉重新开启一个项目&#xf…

雅虎年底升级IPv6标准 100万用户恐受影响

雅虎年底升级IPv6标准 100万用户恐受影响 http://network.51cto.com 2011-01-20 17:34 佚名 cnBeta 我要评论(0) 据国外媒体报道&#xff0c;雅虎计划今年年底将主站点Yahoo.com升级为IPv6标准&#xff0c;此举可能会使约100万用户在初期无法访问雅虎站点。据国外媒体报道&…

Linux v4l2框架分析

背景说明&#xff1a;Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio1. 概述V4L2(Video for Linux 2)&#xff1a;Linux内核中关于视频设备驱动的框架&#xff0c;对上向应用层提供统…

JAVA自学笔记23

JAVA自学笔记23 1、多线程 1&#xff09;引入&#xff1a; 2&#xff09;进程 是正在运行的程序。是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。 多进程&#xff1a; 单进程的计算机只能做一件事情&#xff0c;而现在的计算机都可以做…

上午写了一段代码,下午就被开除了~

俗话说得好&#xff0c;“代码写的少&#xff0c;离职少不了”。最近畅游互联网&#xff0c;发现一些离职小技巧&#xff0c;读后&#xff0c;内心被深深地打动了……但是&#xff0c;细细品过之后&#xff0c;发现对我们程序员不太适用了。例如&#xff1a;领导夹菜你转桌&…

nginx加载html目录下图片,nginx配置访问图片路径以及html静态页面的调取方法

nginx配置访问图片路径以及html静态页面的调取方法发布时间&#xff1a;2017-03-09 12:06来源&#xff1a;互联网当前栏目&#xff1a;web技术类给大家讲一个快速配置nginx访问图片地址&#xff0c;以及访问html静态页面的配置。1.实验环境首先随便某个路径下创建相应的目录。如…

微信小程序继续入坑指南

微信小程序继续入坑指南 wxml 类似于html 感觉和ejs灰常的相似 数据绑定 js Page({data: {message: "hello world"} })wxml <view>{{message}}</view> 使用的是https://mustache.github.io/模板引擎系统 对组件的属性和控制属性的更改 <view id"…

思科收购网络安全管理厂商Pari Networks

思科收购网络安全管理厂商Pari Networkshttp://netsecurity.51cto.com 2011-01-28 09:39 胡杨 译 网界网 我要评论(0)摘要&#xff1a;思科本星期宣布&#xff0c;它打算收购私营企业Pari Networks。这个企业是前思科工程师创建的&#xff0c;主要提供网络配置、变更和合规…

20年软件工程师的经验

软件工程师在做设计的时候&#xff0c;一定要有设计的思维&#xff0c;码农如果只是砌砖的&#xff0c;那么他的可替代性和技能能力并不高。前段时间看到一个设计师傅&#xff0c;在很狭小的空间内设计了非常非常不错的室内设计&#xff0c;利用了每一个可以利用的地方。如果我…

html超市代码,前端 CSS : 5# 纯 CSS 实现24小时超市

介绍原文链接感謝 comehope 大佬的 [前端每日实战]效果预览源代码地址代码解读1. html 结构命名规则使用了 BEM常规样式初始化* {margin: 0;padding: 0;box-sizing: border-box;}body {height: 100vh;overflow: hidden;}2. 街道背景街道背景分为两部分深蓝色的天空.street {hei…

送30块树莓派PICO 开发板!

大家好&#xff0c;今天是周日&#xff0c;给大家搞个小抽奖&#xff0c;送30块。嵌入式猛男必备&#xff0c;学嵌入式看『我要学嵌入式』&#xff0c;知识持久有力。点击关注&#xff0c;回复【1031】参与抽奖&#xff0c;免费送 10块 树莓派最新PICO开发板。学C语言看『写代码…

嘉立创又搞大事情了,与你我相关!

你们一定不知道嘉立创最近又悄咪咪的做了一件大事儿&#xff0c;硬创社硬件项目共享平台上线公测啦&#xff0c;这是一个帮助电子工程师实现技术变现的平台&#xff0c;平台刚刚上线公测&#xff0c;前期还在邀请电子工程师填充内容阶段&#xff0c;即日起平台每上传一个项目就…

c html联调,JS与native 交互简单应用

JS与native 交互简单应用一、objectiveC 语法简介二、简易项目浏览器搭建新建项目步骤&#xff1a;1>DraggedImage.png2>2222.png3>33333.png4>4444.png建立一个小的浏览器即webview关键代码如下&#xff1a;// context 上下文也可以在此处获取&#xff0c;开始加载…

写给我弟

我堂弟今年24岁&#xff0c;也是我最小的一个堂弟&#xff0c;我想给他说点事&#xff0c;想告诉他一些东西&#xff0c;但是也担心自己所说的&#xff0c;并不能让他认同和接受。我心里一定是有我弟的&#xff0c;也是装着我弟的&#xff0c;所以我弟的事情&#xff0c;我自己…

Chrome插件(扩展)

【干货】Chrome插件(扩展)开发全攻略 写在前面 我花了将近一个多月的时间断断续续写下这篇博文&#xff0c;并精心写下完整demo&#xff0c;写博客的辛苦大家懂的&#xff0c;所以转载务必保留出处。本文所有涉及到的大部分代码均在这个demo里面&#xff1a;https://github.com…

Apache OpenJPA 2.1.0 发布

OpenJPA 是 Apache 组织提供的开源项目&#xff0c;它实现了 EJB 3.0 中的 JPA 标准&#xff0c;为开发者提供功能强大、使用简单的持久化数据管理框架。OpenJPA 封装了和关系型数据库交互的操作&#xff0c;让开发者把注意力集中在编写业务逻辑上。OpenJPA 可以作为独立的持久…

手把手带你写一个中断输入设备驱动

今天群里有人问&#xff0c;要开始驱动开发的话从什么开始比较好。我说&#xff0c;应该开始去摸索触摸屏驱动&#xff0c;现在我想了下&#xff0c;触摸屏驱动可能会难了些&#xff0c;但是从一个GPIO开始&#xff0c;我觉得一定是一件很容易的事情。所以这篇文章就来了。大家…

驱动调试神器printk你掌握了吗?

[导读] 刚刚开始做Linux相关开发工作时&#xff0c;深感Linux内核代码庞大&#xff0c;要加些自己的驱动进内核代码树&#xff0c;常常深陷bug的泥沼难以自拔&#xff0c;今天来分享一下内核调试利器printk的使用心得。前面一段时间很忙&#xff0c;后期更文频率会渐渐回归正常…

腾讯云技术专家卢萌凯手把手教你Demo一个人脸识别程序!

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文来自腾讯云技术沙龙&#xff0c;本次沙龙主题为Serverless架构开发与SCF部署实践 卢萌凯&#xff1a;毕业于东南大学&#xff0c;曾就职于华为&#xff0c;熟悉云行业解决方案。目前负责腾讯云中间件产…

二十世纪最伟大的算法,你了解哪个?

导读&#xff1a;作者July总结了一篇关于计算方法的文章《 细数二十世纪最伟大的10大算法 》。一、1946 蒙特卡洛方法[1946: John von Neumann, Stan Ulam, and Nick Metropolis, all at the Los Alamos Scientific Laboratory, cook up the Metropolis algorithm, also known …