名词解释

名词解释文档中集中了 Kafka 中常见名词的解释,具体内容见下文:

kafka

Kafka 是一个实现了分布式、分区、提交后复制的日志服务。它通过一套独特的设计提供了消息系统中间件的功能。

消息

消息是 Kafka 中最基本的数据单元。消息由一串字节组成,其中主要由 key 和 value 构成,key 和 value 也都是 byte 数组。key 的主要作用是根据一定的策略,将此消息路由到指定的分区中,这样就可以保证包含同一 key 的消息全部写入同一分区中,key 可以是 null。消息的真正有效负载是 value 部分的数据。

broker

一个单独的 Kafka server 即为一个 broker 。broker 的主要工作就是接收生产者发送过来的消息,分配 offset ,之后保存到磁盘中;同时接收消费者、其它 broker 的请求,根据请求类型进行相应的处理并返回响应。

topic

topic 是用于存储消息的逻辑概念,可以看做一个消息的集合。每个 topic 可以有多个生产者向其中推送(push)消息,也可以有任意多个消费者消费其中的消息。

每个 topic 可以划分成多个分区(每个 topic 至少有一个分区),同一个 topic 下的不同分区包含的消息不同。每个消息在被添加到分区时都会被分配一个 offset 。

partition

为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的 id(offset)。Kafka 只保证按一个 partition 中的顺序将消息发给 consumer,不保证一个 topic 的整体(多个 partition 间)的顺序。

offset 

offset 是消息在分区中的唯一编号,Kafka 通过 offset 保证消息在分区内的顺序,offset 的顺序性不跨分区,即 Kafka 只保证同一分区内消息是有序的,同一个 topic 内的不同分区中的消息,Kafka 并不保证其顺序性。

副本

Kafka 对消息进行了备份冗余,每个分区可以有多个副本,每个副本中包含的消息是一样的(在同一时刻,副本之间其实并不是完全一样的)。每个分区至少有一个副本,当分区中只有一个副本时,就只有一个 leader 副本,没有 follower 副本。

每个分区的副本集合中,都会选举出一个副本作为 leader 副本,Kafka 在不同的场景下会选用不同的选举策略。所有的读写请求都由选举产生的 leader 副本处理,其它都作为 follower 副本,follower 副本仅仅是从 leader 副本处把数据拉取到本地之后,同步更新到自己的 log 中。

生产者

生产者(producer)的主要工作是生产消息,并将消息按照一定的规则推送到 topic 的分区中。

消费者

消费者(consumer)主要的工作是从 topic 中拉取消息,并对消息进行消费。

consumer group 

这是 Kafka 用来实现一个 topic 消息的广播(发给所有的 consumer)和单播(发给任意一个 consumer)的手段。一个 topic 可以有多个 Consumer Group 。topic 的消息会复制(不是真的复制,是概念上的)到所有的 Consumer Group ,但每个 Consumer Group 只会把消息发给该 Consumer Group 中的一个 consumer。如果需要实现广播,只要每个 consumer 有一个独立的 Consumer Group 就可以了。要实现单播只要所有的 consumer在同一个 Consumer Group 。用 Consumer Group 还可以将consumer 进行自由的分组而不需要多次发送消息到不同的 topic。