w
wnwk
V1
2022/11/25阅读:33主题:默认主题
kafka备忘录
borker
kafka集群可能由多个服务器组成,一个服务器称为一个broker。
topic
kafka是按照topic 来区分消息的,发往同一个topic的消息可以看作一类消息。topic以文件的方式来存储消息。为 了解决大文件的问题,提出了分区的概念
分区
一个topic可以对应多个分区,简单理解为一个文件按照分区数目被切分。这样的好处是 提高了生产者写的消息,可以并行写。消费的效率也提高了,可以并行读。
副本
数据的备份
生产者相关的
生产者可以配置发送失败的重试次数
发送缓冲区
消息会先被放入到缓冲区内,kafka会从从缓冲区内拉取指定大小的数据发送,如果没有达到指定的大小,会在一定的等待时间后发送消息
消费者相关的
消费组
一个消费组内可以有多个消费者
消费组和分区的关系
-
一个分区只能被一个消费组内的一个消费者消费 -
消费组的一个消费者可以消费多个分区。
之所以做这个限制,是为了保证一个分区内消息在一个消费组内消费的有序性。如果一个分区可以被一个消费组内的多个消费者消费,由于消费速度不同,无法保证消息被顺序消费。d但是无法保证一个topic多个分区总体消费的有序性。
消费offset
消费者在消费消息的时候,会向topic提交消费信息的offset,可以在一定程度上保证不会重复消费消息。这些信息会保存在一个默认的topic内,保存信息中包含topic,分区,offset等信息
消费者自动提交和手动提交 offset
-
自动提交,消费者从topic 中pull 下消息后,就提交对应的offset,可能存在丢消息的可能,当消息pull下后,消费者没有消费消息就异常了,导致offset更新了,但是消息没有被消费 -
手动提交,消费者消费完消息后在提交对应的offset -
同步提交 -
异步提交
-
消费者消费消息的配置
-
可以设置每次pull 消息的最大数目 -
可以设置每次pull消息所耗费的最大时间,如果在规定时间内拉取到了设置的最大数目就停止pull,处理消息。如果没有达到最大数目,达到最大时间后就停止拉取消息,处理获取到的消息 -
可以设置pull的时间间隔。如果两次pull的时间超过了设定值,kafka认为消费能力弱,会把消费者踢出集群,触发rebalance
新消费者offset
-
默认是消费最新的消息 -
可以设置从从开始消费,也会消费历史消息
消费者分配策略
-
range ,根据分区个数,消费者数目,按照公式,每个消费者消费指定的分区 -
round ,每个消费者依次消费每个分区。 -
sticky,如果出现rebalance,保证原有的消费者和分区的消费关系不变。只会重新规划变化的部分。
rebalance机制
前提是消费者没有指定消费那个分区。这是会触发rebalance,为消费者指定分区
hw 和 leo
-
LEO 指的是 最后一条消息的位置 -
hw指的是最小 的leo 值,对于消费者而言,只能消费hw之前的数据。通过这种方式保证了数据的可靠性 这两个概念是针对一个分区和此分区对应的副本而言的。假设一个分区由两个副本,由于消息的读写都是通过leader来处理的,leader在存储消息后,会通知副本存储。2个副本的同步可能存在时间差。假设当前有2条消息,hw 和leo 都是2,消费者可以消费这两条消息,随后写入了三条消息,hw 为2 ,leo 为5 。当副本一 同步了2 条消息,副本二同步了一条消息后,hw 为3,leo还是5 ,消费者可以消费3条消息。但副本一和二同步了所有消息后,hw变为5,leo 还是5 ,这时消费者可以消费5条消息
如何保证消息的可靠性
-
发送端的可靠性。 -
要采用同步发送的方式。 -
ack 为0,可靠性最低,不需leader确认是否收到了消息。 -
ack 为1 ,leader 确认接受到了消息,但是消费没有被follower备份 -
ack 为all ,leaser收到消息,并所有的follower已备份
-
-
-
broker的可靠性 -
在ack 为 0,或1 的情况下,如果leader故障。导致消息丢失
-
-
消费端 手动提交

作者介绍
w
wnwk
V1