> For the complete documentation index, see [llms.txt](https://shuixn.gitbook.io/notebook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://shuixn.gitbook.io/notebook/da-shu-ju/kafka.md).

# Kafka

Kafka 是由 Linkedin 公司开发的，它是一个分布式的，支持多分区、多副本，基于 Zookeeper 的分布式消息流平台，它同时也是一款开源的基于发布订阅模式的消息引擎系统。

## 概念

1. Producer：消息生产者，向Broker发送消息的客户端
2. Broker：消息中间件处理节点，一个Kafka节点就是一个broker，一个或者多个Broker可以组成一个Kafka集群
3. Consumer：消息消费者，从Broker读取消息的客户端
4. ConsumerGroup：每个Consumer属于一个特定的Consumer Group，一条消息可以发送到多个不同的Consumer Group，但是一个Consumer Group中只能有一个Consumer能够消费该消息
5. Partition：物理上的概念，一个topic可以分为多个partition，每个partition内部是有序的
6. Topic：主题，Kafka根据topic对消息进行归类，发布到Kafka集群的每条消息都需要指定一个topic
7. 消息：Kafka 中的数据单元被称为消息，也被称为记录，可以把它看作数据库表中某一行的记录。
8. 批次：为了提高效率， 消息会分批次写入 Kafka，批次就代指的是一组消息。
9. 偏移量(offset)：一种元数据，它是一个不断递增的整数值，用来记录消费者发生重平衡时的位置，以便用来恢复数据。
10. 副本：Kafka 中消息的备份又叫做 副本（Replica），副本的数量是可以配置的，Kafka 定义了两类副本：领导者副本（Leader Replica） 和 追随者副本（Follower Replica），前者对外提供服务，后者只是被动跟随。
11. 重平衡(Rebalance)：消费者组内某个消费者实例挂掉后，其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。

## 生产者

### 高性能

1. 顺序读写
2. 零拷贝
3. 消息压缩
4. 分批发送

### 分区策略

1. 顺序轮训（默认）：顺序分配，消息是均匀的分配给每个 partition，即每个分区存储一次消息
2. 随机轮训：随机轮询简而言之就是随机的向 partition 中保存消息
3. key-ordering 策略：Kafka 中每条消息都会有自己的key，一旦消息被定义了 Key，那么你就可以保证同一个 Key 的所有消息都进入到相同的分区里面，由于每个分区下的消息处理都是有顺序的，故这个策略被称为按消息键保序策略

## 消费者

1. 如果应用需要读取全量消息，那么请为该应用设置一个消费组
2. 如果该应用消费能力不足，那么可以考虑在这个消费组里增加消费者
3. 消费者组中的消费者数量不应该大于分区数量，多余的消费者会空闲

### 消费方式

1. 点对点：一个消费者群组消费一个主题中的消息，这种消费模式又称为点对点的消费方式，点对点的消费方式又被称为消息队列
2. 发布订阅：一个主题中的消息被多个消费者群组共同消费，这种消费模式又称为发布-订阅模式

### 重平衡

最初是一个消费者订阅一个主题并消费其全部分区的消息，后来有一个消费者加入群组，随后又有更多的消费者加入群组，而新加入的消费者实例分摊了最初消费者的部分消息，这种把分区的所有权通过一个消费者转到其他消费者的行为称为**重平衡**

1. 优点：重平衡非常重要，它为消费者群组带来了 高可用性 和 伸缩性，我们可以放心的添加消费者或移除消费者。
2. 缺点：在重平衡期间，消费者无法读取消息，造成整个消费者组在重平衡的期间都不可用。另外，当分区被重新分配给另一个消费者时，消息当前的读取状态会丢失，它有可能还需要去刷新缓存，在它重新恢复状态之前会拖慢应用程序。
