此篇文章不做过多用法上的指导,将从kafka的逻辑层面、物理层面的组成部分进行剖析。以下是此篇文章论述的思维导图。
逻辑
生产者
生产者也就是生成消息。它会通过主线程进行消息的产生,加入到双端队列中;通过Sender线程进行消息的真实发送。
主线程
经过拦截器、序列化器、分区器加入到每个分区对应的双端队列中(每个分区对应多个队列由一个个RecordBatch组成,RecordBatch由一条条消,队列息组成)
Sender线程
- 从双端队列的头部获取ProducerBatch
- 封装为<Node,List<ProducerBatch>>,最后转化为<Node,Request>
- 发送给Producer之前会缓存<NodeId,Deque<Request>>,其实是为了保存未响应的请求
Broker
逻辑层面broker就是存储分区的副本数据。
消费者
消费方式
点对点:消费者组只有一个消费者
订阅:消费者组多个消费者
位移
位移保存:位移会被保存在kafka中的_consumer_offsets的topic中
位移提交:分为自动提交和手动提交,自动提交可能会造成重复消费或者消息丢失问题。
物理
Broker机器
存储消息的机器
事务/再均衡协调器
- kafka会通过groupId(如果事务的话就通过事务id)对consumer_offsets分区数进行取余。
- 通过该值确定具体的分区。
- 找到分区的Leader副本所在的机器,该broker机器就是协调器
Kafka的控制器
通过zk会选举出Kafka的控制器,控制器负责集群的管理。比如:副本故障重新选Leader副本;分区的ISR变化,通知集群内机器;分区重分配等
Zookeeper集群
- 通过zk集群选举出唯一的控制器(临时节点)。
- 还会创建一个控制器纪元的节点(持久化节点),该值维护控制器的选举纪元。