关于Kafka这个组件,作为大数据技术生态当中流行的消息组件,得到越来越多的市场认可,kafka与大数据技术生态的诸多组件,也能实现很好地集成,地位也越来越稳固。今天的大数据开发学习分享,我们就主要来讲讲Kafka producer设计原理。
1.序列化消息&计算partition
根据key和value的配置对消息进行序列化,然后计算partition:
ProducerRecord对象中如果指定了partition,就使用这个partition。否则根据key和topic的partition数目取余,如果key也没有的话就随机生成一个counter,使用这个counter来和partition数目取余。这个counter每次使用的时候递增。
2.发送到batch&&唤醒Sender线程
根据topic-partition获取对应的batchs(Dueue<ProducerBatch>),然后将消息append到batch中.如果有batch满了则唤醒Sender线程。队列的操作是加锁执行,所以batch内消息时有序的。后续的Sender操作当前方法异步操作。
3.Sender把消息有序发到broker(tp replia leader)
①确定tp relica leader所在的broker
Kafka中每台broker都保存了kafka集群的Metadata信息,Metadata信息里包括了每个topic的所有partition的信息:leader,leader_epoch,controller_epoch,isr,replicas等;Kafka客户端从任一broker都可以获取到需要的Metadata信息;sender线程通过Metadata信息可以知道tp leader的brokerId。
producer也保存了Metada信息,同时根据Metadata更新策略(定期更新Metadata.max.age.ms、失效检测,强制更新:检查到Metadata失效以后,调用Metadata.requestUpdate()强制更新。
②幂等性发送
为实现Producer的幂等性,Kafka引入了Producer ID(即PID)和Sequence Number。对于每个PID,该Producer发送消息的每个<Topic,Partition>都对应一个单调递增的Sequence Number。同样,broker端也会为每个<PID,Topic,Partition>维护一个序号,并且每Commit一条消息时将其对应序号递增。对于接收的每条消息,如果其序号比broker维护的序号)大一,则broker会接受它,否则将其丢弃。
如果消息序号比broker维护的序号差值比一大,说明中间有数据尚未写入,即乱序,此时broker拒绝该消息,Producer抛出InvalidSequenceNumber。
如果消息序号小于等于broker维护的序号,说明该消息已被保存,即为重复消息,broker直接丢弃该消息,Producer抛出DuplicateSequenceNumber。
Sender发送失败后会重试,这样可以保证每个消息都被发送到broker。
4.Sender处理broker发来的produce response
一旦broker处理完Sender的produce请求,就会发送produce response给Sender,此时producer将执行我们为send()设置的回调函数。至此producer的send执行完毕。
关于大数据开发学习,Kafka producer设计原理,以上就为大家做了简单的介绍了。在大数据框架当中,Kafka作为消息组件,在企业级开发当中应用越来越普遍,学习阶段也应当多投入精力去钻研。