大数据开发: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的信息:leaderleader_epoch,controller_epoch,isr,replicas等;Kafka客户端从任一broker都可以获取到需要的Metadata信息;sender线程通过Metadata信息可以知道tp leaderbrokerId。

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版本过高所致,2.2+=的版本,已经不需要...
DWS层主要是存放大宽表数据,此业务中主要是针对Kafka topic...
不多BB讲原理,只教你怎么用,看了全网没有比我更详细的了,...
终于写完了,其实最开始学kafka的时候是今年2月份,那时候还...
使用GPKafka实现Kafka数据导入Greenplum数据库踩坑问题记录(...