TopicCommand
- writeTopicPartitionAssignment
- /brokers/topics/[topic]/partitions/[0…N]
KafkaProducer
- 初始化Metadata
- 初始化RecordAccumulator
- 创建Sender服务线程
- Sender服务循环:
- 获取准备发送数据的partition列表
- drain出指定节点的所有数据并放入batch列表
- 如需保证消息顺序,mute所有partition的数据
- abortExpiredBatches
- 发送ProduceRequest
- 客户端poll指定连接:如果有分区的数据准备好了发送,timeout=0;如果有分区的数据积累但为准备好,timeout=[linger expiry time] - now;否则,timeout=[metadata expiry time]-now
KafkaConsumer
- 初始化ConsumerCoordinator
- 初始化Fetcher
- consumer主循环:
- pollOnce,第一轮Poll检查数据,如果启用了自动提交,会commit offset
- 向分区leader发送fetch请求,fetch记录
- 返回ConsumerRecord
ConsumerCoordinator
consumer group写在ZK的/consumers节点。
- poll操作
- ensureCoordinatorReady()确定coordinator存在。
- 判断是否需要rejoin,如果需要rejoin:
- 刷新元数据
- 确定group是active状态:一致且加入了group。加入group:发送JoinGroupRequest,如成功先分配组,再发送SyncGroupRequest。
- 向coordinator发送OffsetCommitRequest,执行自动的offset提交,异步执行。
Leader再平衡
验证指定topic的所有分区,移除失效分区,写入ZK的/admin/preferred_replica_election节点