Kafka系统架构

Kafka 作为一个消息引擎中间件,越来越多的被国内各个厂商使用。本篇主要介绍一下其系统架构及常用术语。

Kafka 架构

从上图可以看出,和其他消息引擎类似,主要由生产者、Kafka 集群、消费者构成。但是其中有一点需要注意的是,Kafka 集群和消费者依赖了ZooKeeper 集群。上图中的每个Broker 对应的就是一个一个的Kafka 实例,每个Broker 上面可能会有多个 Partition,也就是所谓的分区副本。如上面的Producer A 生产了 Topic A 的消息,然后存放的时候分为了 Partition 0 和 Partition 1 两个数据分区存储。Producer 生产出来的数据只会直接发给每个 Partition 的 Leader 来接收。然后每个 Partition 对应的 Follower 会复制Leader 上面的数据做冗余备份,Follower 本身不对外提供服务。

从上面的消费者可以看出,Consumer A1 和 Consumer A2 是一个消费者组。它们共同消费了 Topic A,此时对于同一个消费者组而言,同一个 Topic 不会重复消费。也就是 Topic A 的消息,在同一个消费者组内只会被一个消费者消费。

常见术语

Topic:消息主题,Kafka 会对消息进行归类,发布到Kafka 集群中的消息都需要指定一个 Topic。同一个 Topic 的数据会被存储在一个或多个 Broker 上面。

Producer:消息生产者,会以 push 的方式向 Kafka 集群推送数据。

Consumer:消息消费者,会以 pull 的方式向 Kafka 集群拉取数据。

Broker:一个Kafka 实例(Server)就是一个Broker,一个或者多个Broker 组成 1 个Kafka集群。

Partition:物理上的Topic 分区,一个 Topic 可以分多个Partition,每个 Partition 都是一个有序队列。Partition 中的每条消息都会被分配一个有序的ID (offset)。

Consumer Group:每个消费者都属于一个消费者组。可以显示指定消费者组,若不指定则属于默认消费者组。这是 Kafka 用来实现一个 Topic 的广播和单播。一个 Topic 可以有 1 个或 多个消费者组,Topic 的消息会被复制到所有的消费者组中,但是消费者组只会讲消息分配给组内的一个消费者。如果要实现广播,每个消费者都需要拥有不同的消费者组;如果要实现单播,消费者需要在同一个组内。