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. codeforces #304 DIV2

    先送上一篇题解(虽然全英文的):http://codeforces.com/blog/entry/18034 A题:http://codeforces.com/problemset/problem/5 ...

  2. linux下配置ip地址四种方法(图文)

    (1)Ifconfig命令   第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig  ethx   i ...

  3. 51驱动LCD1602

    1602 采用标准的 16 脚接口,其中: 第 1 脚:VSS 为地电源 第 2 脚:VDD 接 5V 正电源 第 3 脚:V0 为液晶显示器对比度调整端,接正电源时对比度最弱,接地 电源时对比度最高 ...

  4. ajax 基础2

    连接数据库实现分页功能 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Defa ...

  5. 集群下Cookie共享,必须要设置machineKey

    这个节允许你设置用于加密数据和创建数字签名的服务器特定的密钥.ASP.NET自动使用它来保护表单验证Cookie,你也可以将它用于受保护的视图状态数据.同时,这个密钥还用于验证进程外的会话状态提供程序 ...

  6. IOS开发-OC学习-Foundation框架练习

    OC语言Foundation框架中字典.字符串.数组的应用: NSString *string = @"China|Usa|France"; NSArray *array = [s ...

  7. LINUX 无法登入系统(2017-1-16)

    很好的博文:http://blog.csdn.net/caizi001/article/details/38659189

  8. 【腾讯Bugly干货分享】iOS 中 HTTPS 证书验证浅析

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/-fLLTtip509K6pNOTkflPQ 导语 本 ...

  9. spring security 跨域防伪攻击

    applicationContext-security.xml中配置 <http use-expressions="true" disable-url-rewriting=& ...

  10. CSS3 :target伪类实现Tab切换效果 BY commy

    http://www.shejidaren.com/examples/css3-target/css3-target.html#tab1 标签一 标签二 标签三 欢迎加设计达人Q群:50063010设 ...