一:简介
1.相比较消费者、协调者、控制器、日志存储而言,生成者的功能相对较简单,因大部分的工作都交给Broker来处理,生产者需要关注的是消息提交失败、消费者反馈的失败的处理上面;
2.生产消息的流程:消息放入队列中、由消息发送线程拉取消息、批量发送给Brokers;
3.生产程序KafkaProducer;
4.消息收集器,RecordAccumulator,负责缓存生产者客户端产生的消息;
5.发送线程:负责读取RecordAccumulator的批量消息,通过网络发送给Brokers;
二:
1.同步方式,异步方式
同步方式的缺点是需要等待,因为Brokers的主备副本需要同步完成,才会返回成功;
异步可以传递回调方法来处理,使用异步一定要有手段能感知错误;
2.消息发送的方式
消息没有key的时候,采用轮询的方式;有key的时候,散列后发放,这样尽可能保证分区的数据均匀;
消息发往哪个分区,是由生产者客户端决定的;
3.分区的结构
分区编号,主副本,副本集,同步副本集;
4.RecordAccumulator和batch.size、linger,大小和时间;
5.发送线程的工作,合并分区的消息、提交给网络连接对象;
三:客户端网络连接对象
1.NetworkClient管理客户端和服务端的通信,包括连接简历、发送请求、读取响应;
2.发送请求:请求队列、上条处理后,下条发送;
3.轮询、调用响应函数,执行回调函数;
4.采用java NIO来处理和不同节点的交互;
SocketChannel 客户端网络连接通道,底层字节数据的读写都在通道上;
Buffer,和通道一起用,写入缓冲区,从缓冲区中读;
Selector选择器,这是比较常用的,从select、epoll到 NIO、netty等都在用,目的是为了提高效率;
SelectionKey,关联选择器和通道;
5.客户端具体步骤
选择器的 connect()方法会 创 建客户端到指定远程服务器的网络连接,选择器监听到客户端的读写事件,会根据SelectionKey获取相应的通道,利用缓冲区读写;
选择器上调用轮询方法,不断的注册事件、执行事件处理、取消事件,客户端发送请求,接收结果;
6.服务端的步骤
Broker的服务端也是使用NIO的网络服务,它启动一个接收线程Acceptor和多个处理器Processor,将连接部分和请求部分使用不同的线程来处理,这样请求的处理不会阻塞不断到来的连接;
a)处理器Processor接收从客户端发送的对象,包装成Request,放入请求通道的请求队列;
b)服务端通过处理器中的选择器Selector的轮询,获得客户端的请求,并交于KafkaApis去处理;
c)Apis处理完成后,会创建响应对象,并放入请求通道的响应队列;