ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-06-03 17:59:49  阅读:151  来源: 互联网

标签:Sender producer partition Broker Kafka 消息 原理 metadata


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

标签:Sender,producer,partition,Broker,Kafka,消息,原理,metadata
来源: https://blog.csdn.net/shuimuzh123/article/details/117530954

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有