Skip to content

基本概念

ISR(In-Sync Replicas) 和 Leader 同步的副本集合,确保高可用和数据一致性

Broker : 和AMQP里协议的概念一样, 就是消息中间件所在的服务器

Topic(主题) : 每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)

Partition(分区) : Partition是物理上的概念,体现在磁盘上面,每个Topic包含一个或多个Partition.

Producer : 负责发布消息到Kafka broker

Consumer : 消息消费者,向Kafka broker读取消息的客户端。

Consumer Group(消费者群组) : 每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。

offset 偏移量: 是kafka用来确定消息是否被消费过的标识,在kafka内部体现就是一个递增的数字

kafka消息发送的时候 ,考虑到性能 可以采用打包方式发送, 也就是说 传统的消息是一条一条发送, 现在可以先把需要发送的消息缓存在客户端, 等到达一定数值时, 再一起打包发送, 而且还可以对发送的数据进行压缩处理,减少在数据传输时的开销

replicas 副本 可以确保某个服务器出现故障时,确保数据依然可用

幂等性,

Kafka引入了 Producer ID(PID)和 Sequence Number的概念。

PID:每个Producer在初始化时,都会分配一个唯一的PID,这个PID对用户来说,是透明的。

Sequence Number:针对每个生产者(对应PID)发送到指定主题分区的消息都对应一个从0开始递增的Sequence Number。

事务

initTransactions(初始化事务):要使用Kafka事务,必须先进行初始化操作

beginTransaction(开始事务):启动一个Kafka事务。

sendOffsetsToTransaction(提交偏移量):批量地将分区对应的offset发送到事务中,方便后续一块提交。

commitTransaction(提交事务):提交事务。

abortTransaction(放弃事务):取消事务

当kafka中没有初始offset或offset超出范围时将自动重置offset

earliest:重置为分区中最小的offset;

latest:重置为分区中最新的offset(消费分区中新产生的数据);

none:只要有一个分区不存在已提交的offset,就抛出异常;

配额(Quotas)

Kafka 4+

彻底告别 ZooKeeper:全面拥抱 KRaft (Kafka Raft)

KRaft (基于 Raft 共识协议的 Kafka 元数据管理模式),KIP (Kafka Improvement Proposal) 编号为 KIP-500

分配策略

RoundRobin:针对集群中的所有 topic;轮询的方式依次将分区分配给消费者。

Range:针对每个 topic;通过 分区数 / 消费者数 决定每个消费者消费几个分区。如果除不尽则前面几个消费者会多消费 1 个分区(topic 很多时容易产生数据倾斜)。这是默认的策略。

Sticky:首先会尽量均衡放置分区到消费者上面,出现同一消费组内消费者出现问题的时候,会尽量保持原有分配的分区不变化。

CooperativeSticky:在不停止消费的情况下进行增量再平衡。

消息丢失

原因:网络故障、Broker宕机 解决:配置 acks=all + 重试机制

消息重复

原因:Consumer重启、网络抖动 解决:业务幂等性设计

消费顺序

原因:多分区并行消费 解决:使用单分区 或 key路由

更新于:

note