Kafka(分区策略以及生产者)

本文详细探讨了Kafka生产者的工作原理,包括分区原则、ACK机制、ISR、数据丢失与重复案例分析,以及幂等性和Exactly Once语义。介绍了在不同ACK配置下数据可靠性的问题,强调了在Kafka中实现Exactly Once语义的重要性,并讲解了幂等性的实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述

Kafka生产者

生产者向Topic的分区中发送数据,每个数据对应的进入不同的分区,因为我分区之后就可以横向扩展了,增加节点了,分区之后并发的读写都可以提高并发量,提高吞吐量。那么生产者是怎么向分区发送数据的呢,我们今天producer发送的数据封装成一个ProducerRecord对象

在这里插入图片描述
我们从最后一个开始看,它只传了一个Topic,还有一个value,这个消息要发往哪个Topic,value代表的是我这条数据是什么,就是这个value。那么这样,我们就能够讲这条数据发往Kafka的Topic了。

倒数第二个,中的key就是用来分区用的,而value还是这条数据。

倒数第三个,多了一个Integer partition,这个代表的是分区号,比如0,1,2。

根分区相关的构造器就这三个,我们看看这三个怎么使用

分区原则与ACK机制

(1)指明 partition 的情况下,直接将指明的值作为 partiton 值

意思是指定哪个分区,这条数据就会去往哪个分区。

在这里插入图片描述
(2)没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的

partition 数进行取余得到 partition 值

也就是说余数作为partition值,举例:我一共有5个分区,我key的Hash值除以5,要么得到0或者,1,2,3,4,正好5个分区。

(3)既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到
partition 值,也就是常说的 round-robin 算法

也就是说下面这个构造器,它要去哪个Partition呢?它怎么round-robin的呢?第一次调用这个分区器的时候,他会先随机生成一个整数,用这个整数去除以这个分区的个数,得到一个余数,这个余数就作为我这条数据要被发往partition的分区号,下一条消息给谁呢,将刚才那个整数加1,然后再除以分区的个数,得到一个新的余数,放到这个余数对应的分区里,这样一来,我们是不是轮询的呀,比如我们呢从2开始,2,3,4,0,1,2,3,4,0,1。。。。。这样轮询的切换。它做了一件事,就是将数据尽可能的均匀的分到不同的分区。也可以理解成负载均衡。

在这里插入图片描述

生产者之消息可靠性

Kafka作为一个传输框架,消息队列,如果要是数据到它这里整丢了能行么?我数据让你缓存一下,你整丢了肯定不行。所以数据消息可靠性是很重要的。所谓可靠性就是完整的送到,别整丢了。

在这里插入图片描述

我们先着重的看第一段,我们提到了Flume,那么FlumeSink其实就相当于Kafka的一个生产者。其底层源码就是Kafka生产者的API。
下面我们以一个分区为例子,看一下生产者发送消息的流程。想要消息可靠性,那就考虑失败了怎么办,失败了我们再发一次就好了,首先生产者会给partition发消息。

在这里插入图片描述
生产者怎么知道发没发送到呢?它肯定会返回给生产者一个相应的。

在这里插入图片描述
生产者收到相应之后,会继续发送下一条消息

在这里插入图片描述

假如我们没有确认收到消息,没有返回给生产者呢?我就重新发送一次,这样的话,我们就能可靠的发送到Partition中,这种机制有可能会数据重复的,有这种情况,消息确实发送过去了,但是确认信息因为网络延迟的缘故,生产者并没有收到确认信息,然后又发送了一遍消息都是有可能的,这种数据重复的情况我们是能解决的,我们后面再说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值