Kafka基本概念与术语
来自于 知识星球 圣思园 张龙
Kafka基本概念与术语
之前,我们完成了Zookeeper与Kafka的基本配置,并且成功启动了Zookeeper与Kafka,还完成了Hello World 示例。
kafka到底是什么?
kafka本质上是一款分布式、基于发布/订阅机制的消息系统,主要使用Scala语言开发而成。概括起来如图所示:
从这个简单的示意图中可以看到,所谓消息队列,本质上就是由生产者向消息队列不断发送消息,而消费者则不断从消息队列拉取消息。虽然,这个图看起来很简单,但它却能很好地说明一个消息队列产品所能完成的主要核心功能。
对于不同的消息队列产品来说,底层实现机制都是不尽相同的,但总体来说,其大体流程都如上图所示。
kafka的底层实际上是非常复杂的,里面涉及到大量的模式、算法、并发处理逻辑;当然,还涉及到很多Java NIO(如Selector、Channel、Buffer等)、零拷贝、异步通信等模块,要想正确把握好kafka这样一个重要的消息队列产品,对于它的一些重要且核心概念应有一个准确的认识。
kafka的重要概念:
生产者(Producer)
生产者就是生产消息的组件,它的主要工作就是源源不断地生产处消息,然后发送给消息队列。生产者可以向消息队列发送各种类型的消息,如狭义的字符串消息,也可以发送二进制消息。
消费者(Consumer)
所谓消费者,指的是不断消费(获取)消息的组件,它获取消息的来源就是消息队列(即kafka本身)。换句话说,生产者不断向消息队列发送消息,而消费者则不断从消息队列中获取消息。这里面的消息队列(即kafka)则充当了一个中介角色,连接了生产者与消费者这两大功能组件。正是从这个意义上来说,借助于消息队列,我们实现了生产者系统与消费者系统之间的解耦,使得原本需要两个系统之间有紧密联系的状况变成了两个系统可以各自针对kafka进行编程(只要提前约定好一些契约即可),这可以使得生产者系统完全不需要了解消费者系统的各种信息(比如说消费者系统的地址、端口号、URL、使用的是REST接口还是RPC等等;反之亦然)。这正是消息队列所提供的另外一个绝佳的好处:极大降低了系统之间的耦合度。
代理(Broker)
代理这个概念是消息队列领域中一个常见的概念。在消息队列领域中,它指的其实就是消息队列产品本身,比如说在kafka这个领域下,broker其实指的就是一台kafka server。换句话说,我们可以将部署的一台kafka server看作是一个broker,就是这样简单。那么从流程上来说,生产者会将消息发送给broker,然后消费者再从broker中拉取消息。
主题(Topic)
主题是kafka中一个极为重要的概念。首先,主题是一个逻辑上的概念,它用于从逻辑上来归类于存储消息本身。多个生产者可以向一个topic发送消息,同时也可以有多个消费者消费一个topic中的消息。topic还有分区与副本的概念,这个比较复杂后续再说,现在你需要理解的是,topic与消息这两个概念之间密切相关,kafka中的每一条消息都会归属于某一个topic,而一个topic下面可以有任意数量的消息。正是借助与topic这个逻辑上的概念,kafka将各种各样的消息进行了分门别类,使得不同的消息归属于不同的topic,这样就可以很好地实现不同系统的生产者可以向同一个broker发送消息,而不同系统的消费者则可以根据topic的名字从broker中拉取消息。topic是一个字符串。实际上,在上节课中,生产者发送消息时就指定了将消息发送给哪个topic,在那个实例中,我们将消息发送给了名为mytest的主题,而消费者在拉取消息时也指定了拉取topic名为mytest的消息。通过topic这样一个逻辑上的概念,我们就很好地实现了生产者与消费者之间有针对性的发送与拉取。
消息(Record)
消息是整个消息队列中最为基本的一个概念,也是最为原子的一个概念。它指的是生产者发送与消费者拉取的一个原子事物。一个消息需要关联到一个topic上,表示该消息从属于哪个topic。消息由一串字节所构成,其中主要由key和value两部分内容,key与value本质上都是字节数组。在发送消息时,我们可以省略掉key部分,而直接使用value部分。正如hello world示例那样,生产者在发送消息时,发送的内容是hello world。实际上,他们都是消息的value,即消息真正的内容本身;key的重要作用则是根据一定的策略,将此消息发送到指定的分区中,这样就可以确保包含同一key值的消息全部都写入到同一个分区中。因此,我们可以得出这样一个结论:对于kafka的消息来说,真正的消息内容本身是由value所承载的。为了提升消息发送的消息和存储效率,生产者会批量将消息发送给broker,并根据响应的压缩算法在发送前对消息进行压缩。
集群(Cluster)
集群指的是由多个broker所共同构成的一个整体,对外提供统一的服务,这类似于我们在部署系统时都会采用集群的方式来进行。借助于集群的方式,kafka消息队列系统可以实现高可用与容错,即一台broker挂掉了也不影响整个消息系统的正确运行。集群中的各台broker之间是通过心跳(heartbeat)的方式来监测其他机器是否还存活。
控制器(Controller)
控制器是集群中的概念。每个集群中会选择出一个broker担任控制器的角色,控制器是kafka集群的中心。一个kafka集群中,控制器这台broker之外的其他broker会根据控制器的指挥来实现相应的功能。控制器负责管理kafka分区的状态、管理每个分区的副本状态、监听zookeeper中数据的变化并作出响应的反馈等功能。此外,控制器也类似于主从的概念(比如说redis的主从概念),所有的broker都会监听控制器leader的状态,当leader控制器出现问题或是故障时则重新选择新的控制器leader,这里面涉及到一个选举算法的问题。
消费者组(Consumer Group)
这又是kafka中的一个核心的概念。消费者组与消费者之间密切相关。在kafka中,多个消费者可以共同构成一个消费者组,而一个消费者只能从属于一个消费者组。消费者组最为重要的一个功能是实现广播与单播的功能。一个消费者组可以确保其所订阅的topic的每个分区只能被从属于该消费者组中的唯一一个消费者所消费;如果不同的消费者组订阅了同一个topic,那么这些消费者组之间是彼此独立的,不会受到相互的干扰。因此,如果我们希望一条消息可以被多个消费者所消费,那就可以将这些消费者放置到不同的消费者组中,这实际上就是广播的效果;如果希望一条消息只能被一个消费者所消费,那么就可以将这些消费者放置到同一个消费组中,这实际上就是单播的效果。
这里我们主要介绍了kafka的关键且重要的概念。对于这些概念的准确理解,是后续学习好kafka框架的关键所在。