Kafka 是一个分布式流平台,广泛应用于大规模实时数据流的处理。它的核心概念可以帮助我们理解其运作方式。本文将以简明的方式介绍 Kafka 的几个关键概念,帮助大家快速上手。
上图是 Kafka 的体系结构,沿用的是以 zk 来管理元数据的架构版本。
上 Kafka 体系结构图中,可以看到有一下几个组件:broker、producer、consumer,其中producer、consumer属于客户端,broker属于服务端。producer将消息推送到broker,consumer从broker拉取消息进行消费处理。
三种角色:broker、producer 和 consumer
broker
服务代理节点。对于Kafka而言,Broker可以简单地看作一个独立的Kafka服务节点或Kafka服务实例。大多数情况下也可以将Broker看作一台Kafka服务器,前提是这 台服务器上只部署了一个Kafka实例。一个或多个Broker组成了 一个Kafka集群 。Broker负责接收和处理客户端(包括生产者和消费者)发送过来的请求,以及对消息进行持久化;虽然多个Broker进程能够运行在同一台机器上,但更常见的做法是将 不同的Broker分散运行在不同的机器上,这样如果集群中某一台机器宕机,即使在它上面 运行的所有Broker进程都挂掉了,其他机器上的Broker也依然能够对外提供服务。
producer
生产者,也就是发送消息的一方。生产者负责创建消息 , 然后将其投递到Kafka中。
consumer
消费者,也就是接收消息的 一方。消费者连接到Kafka上并接收消息,进而进行相应的业务逻辑处理 。
消息管理:主题(Topic)、分区(Partition)和 偏移量(offset)
Kafka 中的消息是以主题为基本单位进行归类的, 各个主题在逻辑 上相互独立。每个主题又可以分为一个或多个分区,分区的数量可以在主题创建的时候指定, 也可以在之后修改。每条消息在发送的时候会根据分区规则被追加到指定的分区中,分区中的每条消息都会被分配一个唯一的序列号, 也就是通常所说的偏移量(offset)。Topic
发布订阅的对象是主题(Topic),可以为每 个业务、每个应用甚至是每类数据都创建专属的主题 。
Partition
分区机制指的是将每个主题划分成多个分区,每个分区是一组有序的消息日志;生产者生产的每条消息只会被发送到一个分区中,也就是说如果向一个双分区的主题发送一条消息,这条消息要么在分区 0 中,要么在分区 1 中;每个分区下可以配置若干个副本,其中只能有 1 个领 导者副本和 N-1 个追随者副本;生产者向分区写入消息,每条消息在分区中的位置信息叫位移。
Offset
上图代表一个日志文件,这个日志文件中有 10 条消息,第一条消息的 offset (LogStartOffset)为 0,最后一条消息的 offset 为 10, offset 为 11 的消息用虚线框表示,代表下 一条待写入 的消息 。日志文件的 High Watermark 为 7,表示消费者只能拉取到 offset 在 0 至 6 之间的消息, 而 offset 为 7 的消息对消 费者而言是不可见 的 。
High Watermark(HW):俗称高水位,它标识 了一个特定的消息偏移量(offset),消费者只能拉取到这个 offset之前的消息。
Log End Offset (LEO) 标识当前日志文件中下一条待写入消息 的 offset,图中 offset 为 11 的位置即为当前日志文件的 LEO,LEO 的大小相当于当前日志分区中最后一条消 息的 offset 值加 1。
消费模型:consumer group
consumer group 是 kafka 提供的可扩展且具有容错性的消费者机制,是一个逻辑概念, Kafka 通过 consumer group 实现了单播和广播两种消息模型的手段。既然是一个组,那么组内必然可以有多个消费者或消费者实例(consumer instance),它们共享一个公共的 ID,即 group ID;组内的所有消费者协调在一起来消费订阅主题(subscribed topics)下所有分区(partition)。当然,每个分区只能由同一个消费组内的一个 consumer 来消费。
• consumer group下可以有一个或多个 consumer instance,consumer instance 可以是一个进程,也可以是一个线程
• group ID 是一个字符串,唯一标识一个 consumer group
• consumer group下订阅的 topic 下的每个分区只能分配给某个 group 下的一个 consumer(当然该分区还可以被分配给其他 group)
如果所有实例都属于同一个Group, 那么它实现的就是消息队列模型;如果所有实例分别属于不同的Group,那么它实现的就是发布/订阅模型。
领取专属 10元无门槛券
私享最新 技术干货