kafka0.10 producer
异步发送的基本思路就是:send的时候,KafkaProducer把消息放到本地的消息队列RecordAccumulator,然后一个后台线程Sender不断循环,把消息发给Kafka集群。
要实现这个,还得有一个前提条件:就是KafkaProducer/Sender都需要获取集群的配置信息Metadata。
所谓Metadata:Topic/Partion与broker的映射关系:每一个Topic的每一个Partition,得知道其对应的broker列表是什么,其中leader是谁,follower是谁。
kafka0.10 consumer
Consumer消费者的工作过程:
在consumer启动时或者coordinator节点故障转移时,consumer发送ConsumerMetadataRequest给任意一个brokers。在ConsumerMetadataResponse中,它接收对应的Consumer Group所属的Coordinator的位置信息。
Consumer连接Coordinator节点,并发送HeartbeatRequest。如果返回的HeartbeatResponse中返回IllegalGeneration错误码,说明协调节点已经在初始化平衡。消费者就会停止抓取数据,提交offsets,发送JoinGroupRequest给协调节点。在JoinGroupResponse,它接收消费者应该拥有的topic-partitions列表以及当前Consumer Group的新的generation编号。这个时候Consumer Group管理已经完成,Consumer就可以开始fetch数据,并为它拥有的partitions提交offsets。
如果HeartbeatResponse没有错误返回,Consumer会从它上次拥有的partitions列表继续抓取数据,这个过程是不会被中断的。
kafka0.10 socketServer
本文详细分析了Kafka中SocketServer中的Acceptor和Processor的主要代码,以及它们是如何在一起构建上层应用的。Kafka采用是经典的Reactor模式,也就是1个Acceptor响应客户端的连接请求,N个Processor来读取数据,从Kafka的实践可见,这种模式可以构建出高性能的服务器。