前言
周末继续填坑,有了上一讲的知识储备,接下来进行生产者的深入讲解就不会搞不清楚生产者在做什么了。虽然本系列主打精炼,但对于必须知道的原理部分,将不会粗略带过,想要掌握的朋友们还需要耐心学习,有时候反复理解才是学习的正常途径,一次不能理解清楚不是理解力不足,是作者的火候不够,讲的不清楚。不用灰心。欢迎私信或者留言给我建议和意见。
生产者框架篇依然停留在理论框架范畴,具体到源码范畴则属于再进一步深入内容,计划在后续篇幅中深入探讨。除此之外,还有涉及到各种异常处理,细节分支以及工程范畴的配置等后续会在wx公众号专栏和不定期更新的番外篇中说明。
欢迎关注wx公众号 青鸟瞰滨
发送模型
由上一章可知,生产者按照既定IP(主题+分区)发送消息到Kafka集群(Broker端),那么发送涉及到诸多因素,基本问题有:
1、发送消息的具体过程是什么
2、发送模式是什么
问题研究
发送过程
- 首先创建一个用于发送消息的对象(以下简称“对象”),对象中存储主题和内容
- 序列化消息内容(key,value)
- 对象被传给分区器,如果在创建对象时已经指定了分区,则直接返回,否则根据一定规则生成分区信息
- 根据主题和分区将对象放到对应的发送批次中,等待批量发送
- 发送线程将一个批次的消息统一通过网络发送到Broker端
发送模式
kafka生产者分为同步发送和异步发送两种方式。
异步发送时,客户端会传递一个回调给服务端,服务端处理完每一条消息后会进行回调。返回本次发送的结果。同步发送则需要等待服务端处理完一条消息后返回发送结果才能继续发送下一条消息;异步发送则无需等待,直接发送下一条消息。
2022年11月23日更新
重要特性
- 发送过程本身在代码实现层面是线程安全的
- producer能够同时往多个服务端节点写数据,从而最大地提高生产者客户端的性能
- 由于消息的最细粒度载体是分区,而broker端不同节点往往存储多个主题的多个节点(这里会在服务端架构篇中详细解释)消息的key往往用来作为分区的依据,用以达到同一主题数据太多可以发往不同broker节点,类似于负载均衡
核心配置
提到kafka,配置是少不了的,为了实现灵活性,kafka提供了大量的配置以满足用户在不同场景的数据处理需求。这里只先介绍producer端的基础配置,后续会在公众号或者不定期更新的番外篇中继续详细深入介绍其他配置。
- bootstrap.servers 指定发送消息目的地broker的地址
- key.serializer 指定“把键对象序列化成字节数组”的工具类,也就是发送前序列化实现类(key)
- value.serializer 指定“把值对象序列化成字节数组”的工具类,也就是发送前序列化实现类(value)
有了以上配置,作为发送方的producer就可以发送数据到远端了。
总结
producer作为生产者,发送消息时需要经历封装消息体、序列化、分区、批量发送几个步骤,本身可以通过异步发送来提高性能,通过配置目的端地址和序列化器就可以发送数据到远端。
下篇预告:消费者架构篇,将进行总体的消费者框架和核心模型介绍,尽情期待!