Kakfa揭秘 Day7 Producer源码解密
Kakfa揭秘 Day7
Producer源码解密
今天我们来研究下Producer。Producer的主要作用就是向Kafka的brokers发送数据。从思考角度,为了简化思考过程,可以简化为一个单机版本的消息队列,只是这个消息队列在远程。
Producer.java
让我们从官方的Example开始。

主要进行了两步操作,第一步是进行producer的初始化,第二步是发送数据。
Producer初始化
分布式系统一般来说只是在单机的基础上加上分布式的通讯和调度而已。
在初始化时有一些重要的参数:
- partitioner.class 设置分区方式。
- producer.type 数据发送方式,默认是同步方式。
- message.send.max.retries 消息发送时重试次数,这也是分布式系统比较重要的设计点。
- topic.metadata.refresh.interval.ms 这个参数非常的关键。当我们的broker的发生失败时,会发出一个refresh操作来刷新brokers上topic的元数据,这个参数控制刷新频率。默认每隔10分钟可能刷新下集群的元数据,如果设置负值时只会在失败的时候刷新,如果设置为0,则每次发送一个消息,都会刷新一次元数据,会影响吞吐量。这个刷新东西是在发送之后才会生成,如果从来没发送过数据,则不会刷新。
为什么要刷新元数据?因为partition可能丢失,leader可能不可用,broker可能会挂掉,也可能在线扩容,这些情况都会造成broker的变动,这是kafka集群和broker弱耦合的实现,客户端在运行过程中可以动态的调整元数据。
发送数据
在发送时,首先要找到Kafka主机的ip和端口,由于kafka有一套自己的消息队列组织方式,所以肯定要根据它的方式,看怎么把数据交到队列里去。
如下代码可以看到,当没有指定partition时,会从集群的元数据中获取partition的信息。

从Example代码中,我们可以看到send有同步和异步两种方式,默认是同步的方式。如果异步的话,中间会有一个缓存(消息队列),producer发入缓存,broker再从里面抓数据。无论是同步还是异步的方式,都会有一个producer pool的方式,会通过线程的方式连上主机。
下面就是具体的数据传输。

其底层用了socket编程。为了持续不断的传输数据时,socket是一种稳定、可靠、数据量可大可小的通讯方式,socket弄出来比较大,但是值得的。
小结
Kafka的producer总结来看,有三个设计要点:
- 作为Producer发给kafka消息,虽然是分布式的,可以用个queue的角度来理解,由于kafka有一套自己的元数据和数据管理机制,所以需要在发送前获得元数据。
- 定期会刷新元数据,为了动态扩容和异常处理。
- 采用socket的方式,进行数据的发送。
欲知后事如何,且听下回分解!
DT大数据每天晚上20:00YY频道现场授课频道68917580
Kakfa揭秘 Day7 Producer源码解密的更多相关文章
- Kakfa揭秘 Day6 Consumer源码解密
Kakfa揭秘 Day6 Consumer源码解密 今天主要分析下Consumer是怎么来工作的,今天主要是例子出发,对整个过程进行刨析. 简单例子 Example中Consumer.java是一个简 ...
- Kakfa揭秘 Day3 Kafka源码概述
Kakfa揭秘 Day3 Kafka源码概述 今天开始进入Kafka的源码,本次学习基于最新的0.10.0版本进行.由于之前在学习Spark过程中积累了很多的经验和思想,这些在kafka上是通用的. ...
- Kakfa揭秘 Day9 KafkaReceiver源码解析
Kakfa揭秘 Day9 KafkaReceiver源码解析 上一节课中,谈了Direct的方式来访问kafka的Broker,今天主要来谈一下,另一种方式,也就是KafkaReceiver. 初始化 ...
- kafka C客户端librdkafka producer源码分析
from:http://www.cnblogs.com/xhcqwl/p/3905412.html kafka C客户端librdkafka producer源码分析 简介 kafka网站上提供了C语 ...
- Catalyst揭秘 Day2 Catalyst源码初探
Catalyst揭秘 Day2 Catalyst源码初探 这节课从源码角度来讲catalyst. 首先有一个观点要澄清,就是技术不是越底层就越是性能和效率更高.因为除了指令执行性能以外,更重要的是架构 ...
- Spark Streaming揭秘 Day26 JobGenerator源码图解
Spark Streaming揭秘 Day26 JobGenerator源码图解 今天主要解析一下JobGenerator,它相当于一个转换器,和机器学习的pipeline比较类似,因为最终运行在Sp ...
- Spark Streaming揭秘 Day22 架构源码图解
Spark Streaming揭秘 Day22 架构源码图解 今天主要是通过图解的方式,对SparkStreaming的架构进行一下回顾. 下面这个是其官方标准的流程描述. SparkStreamin ...
- [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...
- [Spark内核] 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
本課主題 Spark Executor 工作原理图 ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕 Executor 具体是如何工作的 [引言部份:你希望读者看完这篇博客 ...
随机推荐
- selenium python 环境搭建(64位 windows)
之前写了同样的文章,可是后来自己按照给文章再次搭建环境当搭建环境成功后却发现还是无法用.使用from selenium import webdriver,在run的时候却出现ImportError: ...
- cocos2d-x3.x使用rapidjson
rapidjson效率高,所以之前cocostudio里面解析用的jsoncpp也换成了rapidjson. 引擎又带有rapidjson库,所以不用单独去下载,直接就可以用. 这里主要写一下关于解析 ...
- 总结nonatomic,assigncopy,retain
nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问. (atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未 ...
- [Oracle EBS APIs]import Flow routing and DJ routing using BOM_RTG_PUB.PROCESS_RTG APIs
DJ routing --BOM模块的工艺路线 Flow routing -- Flow Manufacturing 模块使用的工艺路线,导入 Flow routing时先导入Line Operati ...
- Call to undefined function imagettftext()解决方法
由 老高 发表于 2014-10-03 在 代码人生 分类 老高在一个新环境中装DEDECMS的时候发现后台验证码无法显示.直接搜索一下这个错误,有人说session错误,有的说权限错误等等,这不胡 ...
- [未完成]关于xml文件的解析
附录一个比较特别的xml文件. MultiNamespaceInlineRequest.xml <?xml version="1.0" encoding="ISO- ...
- 关于JDK中的集合总结(三)
泛型: jdk1.5出现的安全机制. 好处: 1,将运行时期的问题ClassCastException转到了编译时期. 2,避免了强制转换的麻烦. <>:什么时候用?当操作的引用数据类型不 ...
- Font Awesome图标字体库(2015年05月25日)
Font Awesome是一款非常棒的字体图标工具,给个地址,具体的自已慢慢去体会,只能帮你到这儿了...... http://fortawesome.github.io/Font-Awesome/ ...
- CI加载流程小结
无聊,决定水一把. CI(CodeIgniter)是我最早接触的一个框架,到现在也只是用了其中一点零碎的方法.一直想对其流程做个小结,却总是因各种各样的“理由”挨着.看见别人图表齐上阵,没那耐心,就从 ...
- 什么是MVC开发模式以及它和传统开发模式的区别
Model1模式:使用纯JSP或者JSP+JavaBean开发,存在如下缺陷:JSP页面中混合了HTML和JAVA代码,从而给代码的开发和阅读带 来了麻烦:系统后期维护和扩展非常困难,例如在JSP页面 ...