1.Producer 网络请求

1.1 Producer Client角度

KafkaProducer主要靠Sender来发送数据给Broker。

  • Sender: 该线程handles the sending of produce requests to the Kafka cluster. 该线程发送metadata requests来更新它感知的整个集群的视图;另外,主要负责发送produce请求到相关的broker。
  • Selector的主要目的是网络事件的 loop 循环,通过调用selector.poll,不断轮询每个Channel上读写事件。
  • SocketChannel注册到Selector,Selector轮询到事件之后,让SocketChanel和ServerSocketChannel进行通信,做实际的IO等操作。

关注三个方法

  • 1.注册事件(connect,accept,read,write)
  • 2.轮询IO是否就绪
  • 3.执行实际IO等操作。

思考一下,connect, accept, read, write 这4种事件,分别在这3个阶段对应的函数。

Producer发送请求的调用顺序:

KafkaProducer -- Sender -- KafkaClient(NetworkClient) -- Selector -- KafkaChannel

1.2 一次请求的详细过程

  1. KafkaProducer 构造函数启动了Sender线程
  2. Sender.run 调用 NetworkClient的send()函数,调用了selector.send(Send send), 但这个时候数据并没有真的发送出去,只是暂存在了selector内部相对应的KafkaChannel里面。

KafkaChannel先进行了检查,是否存在send的目的地,这是一个2轮询。确保有相应的KafkaChannel之后,调用this.transportLayer.addInterestOps(SelectionKey.OP_WRITE); 1注册 write事件。接下来就交给Selector进行2轮询3实际操作,详细方法是Selector.poll

  1. KafkaProducer.send 调用doSend方法,首先调用waitOnMetadata获取metaData信息, 最后调用的是nioSelector.wakeUp(),让阻塞在select()的Selector立即返回,准备IO事件。(在send之前,会先读取metadata。如果metadata读不到,会一直阻塞在那,直到超时,抛出TimeoutException)

1.3 Selector处理注册的事件

小知识

  • 一个Selector可以处理多个Channel。
  • SelectionKey用来记录一个Channel上的事件集合,每个Channel对应一个SelectionKey。
  • SelectionKey也是Selector和Channel之间的关联,通过SelectionKey可以取到对应的Selector和Channel。

poll 和 pollSelectionKeys 的关键流程(正常情况的处理流程)

我们以write事件coming来举例,当有事件到来的时候,

  1. 找到该事件对应的SocketChannel(即KafkaChannel),为了后续与对应的ServerSocketChannel进行通信

如果这个KafkaChannel是可用的,在channel不是ready的状态下,会channel.prepare进行初始化, 里面包括了权限认证。(会调用下面的这个类进行权限认证,这里也是出过问题的地方:SaslServerAuthenticator#handleKafkaRequest)

  1. 轮询事件的类型,connect, read, write

write事件的情况下,调用Send send = channel.write(); // write--阶段3: 实际的IO操作, 读取完数据后,就取消write事件.

期间出现过任何异常,都会关闭这个KafkaChanel(上面的授权都没有了),常见的是IOException异常,Server端日志经常出现。

KafkaChannel的授权创建是在Selector的connect、register方法中

2 同步和异步

Producer有同步发送和异步发送2种策略。在以前的Kafka client api实现中,同步和异步是分开实现的。

而在0.9以后的版本中,同步发送其实是通过异步发送间接实现,其接口如下:

public class KafkaProducer<K, V> implements Producer<K, V> {
...
public Future<RecordMetadata> send(ProducerRecord<K, V> record, Callback callback) //异步发送接口
{
...
}
}
  • 要实现同步发送,只要在拿到返回的Future对象之后,直接调用get()就可以了。

2.1 基本思路

异步发送的基本思路就是:send的时候,KafkaProducer把消息放到本地的消息队列RecordAccumulator,然后一个后台线程Sender不断循环,把消息发给Kafka集群。

要实现这个,还得有一个前提条件:就是KafkaProducer/Sender都需要获取集群的配置信息Metadata。

所谓Metadata:Topic/Partion与broker的映射关系:每一个Topic的每一个Partition,得知道其对应的broker列表是什么,其中leader是谁,follower是谁。

Kafka 0.10 Producer网络流程简述的更多相关文章

  1. Kafka 0.10问题点滴

    15.如何消费内部topic: __consumer_offsets 主要是要让它来格式化:GroupMetadataManager.OffsetsMessageFormatter 最后用看了它的源码 ...

  2. Kafka 0.10.1版本源码 Idea编译

    Kafka 0.10.1版本源码 Idea编译 1.环境准备 Jdk 1.8 Scala 2.11.12:下载scala-2.11.12.msi并配置环境变量 Gradle 5.6.4: 下载Grad ...

  3. Kafka 0.10 KafkaConsumer流程简述

    ConsumerConfig.scala 储存Consumer的配置 按照我的理解,0.10的Kafka没有专门的SimpleConsumer,仍然是沿用0.8版本的. 1.从poll开始 消费的规则 ...

  4. kafka 0.10.2 消息生产者(producer)

    package cn.xiaojf.kafka.producer; import org.apache.kafka.clients.producer.*; import org.apache.kafk ...

  5. Kafka 0.8 Producer处理逻辑

    Kafka Producer产生数据发送给Kafka Server,具体的分发逻辑及负载均衡逻辑,全部由producer维护. 1.Kafka Producer默认调用逻辑 1.1 默认Partiti ...

  6. Kafka 0.10.0

    2.1 Producer API We encourage all new development to use the new Java producer. This client is produ ...

  7. Kafka 0.10.1.1 特点

    1.Consumer优化:心跳线程可作为后台线程,提交offset,剥离出poll函数 问题:0.10新设计的consumer是单线程的,提交offset是在poll中.本次的poll调用,提交上次p ...

  8. kafka 0.10.2 消息生产者

    package cn.xiaojf.kafka.producer; import org.apache.kafka.clients.producer.KafkaProducer; import org ...

  9. kafka 0.10.2 cetos6.5 集群部署

    安装 zookeeper http://www.cnblogs.com/xiaojf/p/6572351.html安装 scala http://www.cnblogs.com/xiaojf/p/65 ...

随机推荐

  1. CI框架学习——基本的用法(一)

    一.必备知识 1.如何访问你的页面 我在控制器下面建立了admin文件夹,此文件夹下有login.php 文件,我们现在要访问这个文件 http://localhost/gradesystem/ind ...

  2. php学习-数组(一)

    数组函数可以对大量性质相同的数据进行存储,排序,插入及删除等操作. 学习任务: 声明数组,输出数组,遍历数组,查询数组中指定元素,获取数组中的最后一个元素. 删除数组中重复的元素.统计数组中元素的个数 ...

  3. Html标签中Alt和Title都是提示性语言标签

    在Html标签中Alt和Title都是提示性语言标签,在我们浏览一些网页时,鼠标停留在一张图片或文字链接上时,在鼠标的右下角出现一个提示信息框,对目标进行一定的注释说明,这就是它们的作用.    其中 ...

  4. HDU 4044 GeoDefense

    树形DP,和背包差不多.dp[now][x]表示now这个节点的子树上,花费为x的时候,获得的最大防御能力(保证敌方HP<=0) #include<cstdio> #include& ...

  5. SpringMVC和mybatis的框架

    1.首先以一个项目做例子,该项目用到的框架即为SpringMVC+mybatis,项目环境为MyEclipse+sqlserver+tomcat6,项目的地址(项目+数据库备份文件)大家可以上我的百度 ...

  6. 关于安装Windows Live Writer后,内存被占满情况解决

    为了方便写博客,昨天安装了Windows Live Writer2012,但是出现了在安装好后还是正常的,第二天一开机就出现了内存被占满的情况,在资源监视器里看了下也没发现有什么问题.想还是重启一下, ...

  7. Android手势识别总结

    一:首先,在Android系统中,每一次手势交互都会依照以下顺序执行. 1. 接触接触屏一刹那,触发一个MotionEvent事件. 2. 该事件被OnTouchListener监听,在其onTouc ...

  8. 浅谈MySQL分表

    关于分表:顾名思义就是一张数据量很大的表拆分成几个表分别进行存储. 我们先来大概了解以下一个数据库执行SQL的过程: 接收到SQL --> 放入SQL执行队列 --> 使用分析器分解SQL ...

  9. IOS开发中AVFoundation中AVAudioPlayer的使用

    IOS开发中如何调用音频播放组件 1.与音频相关的头文件等都在AVFoundation.h中,所以第一步是添加音频库文件: #import <AVFoundation/AVFoundation. ...

  10. spring mvc自定义注解--登录时密码加密注解

    1,定义注解名称接口 /** * 使用该注解不用再MD5转换了 * * @author adonis * */ @Target(ElementType.PARAMETER) @Retention(Re ...