kafka的Broker就是kafka的server,每个topic的分区会均匀的分布在集群的各个Broker上。我们知道一个topic的单个分区保证顺序的,容灾是由分区的副本来控制,分区的副本有选主的过程,对外提供服务的为leader分区,其余的为follow分区,这些follow分区主动拉取leader接受的消息,然后去更新自己俄LEO,当follow更新完毕之后leader会去更新自己的HW,当某个分区的leader无法对外提供服务了,会在ISR集合中选一个新的leader出来,并且再把ISR即可更新一下。
ISR集合表示:分区follow们和leader的消息记录数目LEO相差在server.properties的配置的阈值之内的分区id集合。
除了分区副本的水平扩展增强容灾的处理,为了提升消费端的能力引入了消费组的设计,一个GROUP可以有多个Consumer,每个Consumer可以消费多个分区,但是每个分区只能被一个Consumer消费。一个topic会有多个分区,每个分区就是一个log,每个segment有一个.index和一个.log文件组成。
集群状态的同步
-
同步复制
当所有的follow都同步消息完成采取递增HW,然后才返回给生产者
-
异步复制
当leader的LEO更新完毕之后就去高职生产者消息接受完毕,然后等所有的follow都同步消息完成采取递增HW。
这俩种方式都是分布式集群数据同步的实现方式,同步复制模式下,如果说有一个follow就是一直无法同步成功,那么会导致HW一直无法递增,消息无法被标记为以提交,生产者得不到ack。而异步复制呢,leader增加成功之后就返回了生产者得到ack之后,follow同步有延时。生产者就可以一直发送了,那么leader的消息数目就远超过follow的数据。如果leader突然宕掉,那么数据就丢失了。kafka为了解决这情况,引入了ISR集合,我们在上面有介绍,这个集合是动态维护的,如果说follow的同步速度的太慢会被提出这ISR集合,如果又追上了相差的阈值,就会重新加入。
Producer
1 构建kafkaProducer所需要的properties参数。
2 构建messageRecord,topic partition等
3 调用send方法发送消息。
4 编写Callback回调方法。
上述为构建kafkaProducer的逻辑,代码很简单就不添加了,我着重说下执行send
方法之后的流程。
send -> ProduceIntercpter ->(Master Thread) Serializer ->Partation ->RecordAccumalator ->(转向到 IO Thread)Sender ->构建参数构建clientRequest---------网络-----> 打开 Socket选择channel ----》和Broker服务器交互,然后返回执行业务内编辑的Callback方法。
kafka的生产者的处理有Master-Worker模式。有Master线程负责收集消息作过滤,序列化,还有指定消息路由的Partation,而Worker线程负责把消息通过socket推送到9092的Broker服务器上。
ProduceIntercpter
类是filter的存在,可以自定义实现用于消息的拦截。
Serializer
是根据对key和value的进行序列化,执行序列化的处理根据构建时候传入的config中的Serializer Class 进行处理。
Partation
这个阶段就是选择topic的分区的过程,如果没有手动指定Partation,那么就采取hash序列化的key进行获取分区。
RecordAccumalator
是整个消息发送过程的中转(缓存),负责存够了一批消息之后批量发送。然后得到批量执行的Server返回结果后,最后在轮询调用每个消息注册的返回的Callback结果。