Kafka 之 - Producer

本文深入探讨了Kafka的Producer工作原理,包括基本术语如Partition、Segment、Consumer Group、Broker Controller、Zookeeper等,并详细讲解了消息的可靠机制、分区逻辑、参数配置及其影响,如acks、batch.size和retries等。此外,还介绍了如何避免重复消费问题以及Producer的分区策略和消息发送流程。
摘要由CSDN通过智能技术生成

1. 前言 why Kafka

支持多个生产者,分布式系统中往往有多个微服务向一个kafka集群发送消息;
支持多个消费者从一个Kafka集群中消费消息,可以通过消费者组实现多个消费者同时协作消费消息。
允许消费者非实时读取消息

高吞吐率的实现

1) 顺序读写

2) 零拷贝

1.1 基本术语

1.1.1 Partition

分区。topic中的消息被分割为一个或多个partition,其是一个物理概念,对应到系统上就是一个或若干个目录。

partition的数量设置为broker数量的整数倍。

一个partition在kafka上就是一个目录,目录名称为:[topicName]-[partitionNo]

一个partition可以被在不同消费者组的消费者同时消费。

多个partition也可以被同一个消费者消费。

1.1.2 segment

段。将partition进一步细分为了若干的segment,每个segment文件的最大大小相等。

segment是一个逻辑概念,其由两类物理文件组成,分别为“.index”文件和“.log”文件。“.log”文件中存放的是消息,而“.index”文件中存放的是“.log”文件中消息的索引。

在这里插入图片描述
.log的文件名为当前该segment前有多少条消息,00000000000000170210.log 表示该segment中,当前文件前面有170210条消息:
在这里插入图片描述

查看segment

对于segment中的log文件,不能直接通过cat命令查找其内容,而是需要通过kafka自带的一个工具查看。

bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /usr/data/kafka-logs/dda-0/00000000000000000000.log --print-data-log

在这里插入图片描述

1.1.3 consumer group

组内可以有多个消费者,他们共享一个group ID。

Kafka在稳定状态下,一个partition中的消息只能被容易个consumer group中的一个consumer消费,一个组内consumer只会消费某一个或特定几个的partition。

一个消息可以同时被多个consumer group消费。

在这里插入图片描述
在这里插入图片描述

1.1.4 Broker Controller

Kafka集群的多个broker中,有一个会被选举为controller,负责管理整个集群中partition和副本replicas的状态。

Kafka集群中第一个启动的broker会通过在zookeeper中创建临时节点/controller 来试图让自己成为controller,其他节点会在该节点消失时收到通知,然后分别再向zk中写/controller节点,只有一个能成功,其他节点只能监听该节点。

1.1.5 Zookeeper

Zookeeper负责维护和协调broker,负责broker controller的选举。

1.1.6 Coordinator

其实是指运行在每一个broker上的group coordinator 进程。用于管理consumer group 中的各个成员,主要用于offset位移管理和Rebalance。一个Coordinator可以管理多个消费者组。

1.1.7 offset

偏移量。每条消息都有一个当前Partition下唯一的64字节的offset,它是相对于当前分区第一条消息的偏移量。

1.1.8 offset commit

Consumer从partition中取出一批消息写入到buffer对其进行消费,在规定时间内消费完消息后,会自动将其消费消息的offset提交给broker,以让broker记录下哪些消息是消费过的。当然,若在时限内没有消费完毕,其是不会提交offset的。

在进行offset commit时,offset也是以消息的形式写入到了_consumer_offset主题的patition中的。系统会为每个提交的offset生成一个key,该key的hash值与50取模

1.1.9 HW与LEO

HW, highWatermark,高水位,表示consumer可以消费的最高patition偏移量。HW保证了Kafka集群正常状态下,partition的follower与leader中消息的一致性。

LEO,log end offset,日志最后消息的偏移量。

对于leader新写入的消息,consumer是不能立刻消费的。leader会等待该消息被所有ISR中的partition follower同步后才会更新HW,此时消息才能被consumer消费。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Org3dLa-1641959484494)(C:\Users\Ellen Liu\AppData\Roaming\Typora\typora-user-images\image-20220103153848957.png)]

1.1.10 ISR

ISR,In-Sync Replicas,是指副本同步列表。

1.1.11 Rebalance

当下面情况发生时,partition的所有权在消费者间转移,即partition会被重新分配

  • 消费者数量发生变化
  • partition数量发生变化

当发生rebalance时,consumer无法读取消息,即broker集群有一小段时间不可用。所以,rebalance会为消费者组及broker集群带来高可用性和伸缩性,但需要避免不必要的rebalance。

2. 基本操作

2.1 启动并查看是否启动成功:

cd /opt/apps/kafka
bin/kafka-server-start.sh -daemon config/server.properties
netstat -ant

在这里插入图片描述

2.2 查看topic

[root@ip-172-31-18-183 kafka]# bin/kafka-topics.sh --list --bootstrap-server 172.31.18.183:9092

在这里插入图片描述

2.3 创建topic

[root@ip-172-31-28-122 kafka]# bin/kafka-topics.sh --create --bootstrap-server 172.31.28.122:9092 --replication-factor 2 --partitions 3 --topic payment

在这里插入图片描述

2.4 查看3个brokers中的分区:

broker-0:

payment-0为主副本

在这里插入图片描述
broker-1:

payment-2为主副本
在这里插入图片描述

broker-2:

payment-1为主副本

在这里插入图片描述

3. 工作原理

3.1 消息的可靠机制-生产者

生产者向kafka发送消息时,可以选择需要的可靠性级别。通过acks参数的值进行设置。
(1) 0值
异步发送。生产者向kafka发送消息而不需要kafka反馈成功ack。该方式效率最高,但可靠性最低。其可能会存在消息丢失的情况。
(2) 1值
同步发送,默认值。生产者发送消息给kafka,broker的partition leader在收到消息后马上发送成功ack(无需等待ISR中的follower同步完成),生产者收到后知道消息发送成功,然后会再发送消息。如果一直未收到kafka的ack,则生产者会认为消息发送失败,会重发消息。

无法保证消息发送成功,但可以确认发送失败。

(3) -1值
同步发送。其值等同于all。生产者发送消息给kafka,kafka收到消息后要等到ISR列表中的所有副本都同步消息完成后,才向生产者发送成功ack。如果一直未收到kafka的ack,则认为消息发送失败,会自动重发消息。

可能会出现部分follower消息重复接收(不是重复消费!):当leader接收消息A后,部分follower同步成功时,leader宕机,该设置生产者会认为消息未发送成功,会再次尝试发送消息A,同步成功的follower会重复接收消息A。

解决办法:每条消息携带一个id,自定义去重机制。

3.2 Partition Leader选举范围

当leader挂了后broker controller会从ISR中选一个follower成为新的leader。但,若ISR中的所有副本都挂了怎么办?可以通过unclean.leader.election.enable的取值来设置Leader选举的范围。
(1) false
必须等待ISR列表中有副本活过来才进行新的选举。该策略可靠性有保证,但可用性低。
(2) true
在ISR中没有副本的情况下可以选择任何一个没有宕机主机中该topic的partition副本作为新的leader,该策略可用性高,但可靠性没有保证。可能发生消息丢失

3.3 HW截断机制

如果partition leader接收到了新的消息, ISR中其它Follower正在同步过程中,还未同步完毕时leader挂了。此时就需要选举出新的leader。若没有HW截断机制,将会导致partition中leader与follower数据的不一致。

3.4 Partition Leader选举范围

当leader挂了后broker controller会从ISR中选一个follower成为新的leader。但,若ISR中的所有副本都挂了怎么办?可以通过unclean.leader.election.enable的取值来设置Leader选举的范围。
(1) false
必须等待ISR列表中有副本活过来才进行新的选举。该策略可靠性有保证,但可用性低。
(2) true
在ISR中没有副本的情况下可以选择任何一个没有宕机主机中该topic的partition副本作为新的leader,该策略可用性高,但可靠性没有保证。OSR中的broker消息不全,可能会发生消息丢失。

3.5 重复消费问题解决

同一个consumer重复消费

当消费者消费能力低,且发生自动提交超时时,consumer会向broker提交一个异常。此时,consumer会再次尝试进行消息消费,从之前的offset开始进行poll消息,产生了消息重复消费

解决方案:手动提交

不同的consumer重复消费

当消费了消息但还未提交offset时宕机,则这些已经被消费的消息会被其他consumer重复消费。

若将自动提交的时间改长,虽然可以降低一个consumer的重复消费的可能,但增加了不同consumer重复消费的可能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值