常用Kafka命令实现

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节点

你可能感兴趣的:(常用Kafka命令实现)