---
url: /kafka.md
---
## 基本概念

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路由
