大数据开发:Kafka producer设计原理

2021/6/3 18:28:05

本文主要是介绍大数据开发:Kafka producer设计原理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

关于Kafka这个组件,作为大数据技术生态当中流行的消息组件,得到越来越多的市场认可,kafka与大数据技术生态的诸多组件,也能实现很好地集成,地位也越来越稳固。今天的大数据开发学习分享,我们就主要来讲讲Kafka producer设计原理。
 

大数据学习: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作为消息组件,在企业级开发当中应用越来越普遍,学习阶段也应当多投入精力去钻研。



这篇关于大数据开发:Kafka producer设计原理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程