本文来说下kafka的基本概念与术语
把数据放到消息队列叫做生产者。从消息队列里边取数据叫做消费者。
消息队列,我们一般简称为MQ(Message Queue) 队列是我们常说的一种先进先出的数据结构。消息队列可以简单理解为:把要传输的数据放在队列中。
消息队列的两种模式:
两者之间最大的不同是:点对点模式中一旦数据被消费了,就会从队列中移除,但是发布/订阅模式不会。
Kafka就是基于发布/订阅模式的分布式消息系统。与其它的消息队列对比,kafka最大的特点就是它的高吞吐量(存的多,读取的快)。
简单介绍下上图内容及工作流程,对相关术语在kafka中的用途有整体认识:
如上图:两个生产者(Producer)A和B;三个消费者A,B,C,并且A和B存在于同一个消费者组;kafka集群中三个broker,两个topic,分别是TopicA,TopicB;TopicA有两个分区(Partition),每个分区有两个副本,分别存在于Broker1和Broker2上,TopicB有一个分区,一个副本,存在于Broker3上,整个集群信息在Zookeeper上注册。
1、生产者向主题生产消息,发布到kafka集群,写入到Leader Replica,Follower Replica 向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步,进行消息冗余。
2、消费者(组)从kafka集群订阅消息,读取Leader Replica中的消息进行消费。
在 Kafka 的世界中有很多概念和术语需要熟练掌握,有助于深入理解Kafka原理。
kafka的相关术语有:生产者Producer,消费者Consumer,消费者组Consumer Group,代理Broker,集群Cluster,消息message,主题Topic,分区Partition,副本Replica,消息位移Offset,消费者位移Consumer Offset,重平衡Rebalance。
生产者(Producer)
向主题发布新消息的客户端应用程序。是消息产生的源头,负责生成消息并发送到Kafka服务器上。
消费者(Consumer)
从主题订阅新消息的客户端应用程序。与生产者类似,消费者也能够同时订阅多个主题的消息。是消息的使用方,负责消费Kafka服务器上的消息。
消费者组(Consumer Group)
多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
我们把生产者和消费者统称为客户端(Clients)。你可以同时运行多个生产者和消费者实例,这些实例会不断地向 Kafka 集群中的多个主题生产和消费消息。
在kafka中,我们可以认为一个group就是一个订阅者,一个消费者只能属于一个消费者组。一个topic中的一个分区,只会被一个group中的一个消费者消费。对于一个topic,同一个group不允许有多于分区个数的消费者同时消费,这意味着有些消费者无法消费到数据。
代理(Broker)
Kafka 的服务器端由被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成,Broker 负责接收和处理客户端发送过来的请求,以及对消息进行持久化。虽然多个 Broker 进程能够运行在同一台机器上,但更常见的做法是将不同的 Broker 分散运行在不同的机器上,这样如果集群中某一台机器宕机,即使在它上面运行的所有 Broker 进程都挂掉了,其他机器上的 Broker 也依然能够对外提供服务。这其实就是 Kafka 提供高可用的手段之一。
broker(kafka集群服务器):是Kafka的服务器,用来存储消息。
Zookeeper集群
kafka是基于zookeeper的,所以需要先搭建一个zookeeper集群,在zookeeper中存储的信息有broker,consumer等重要znode信息。
消息(message)
Kafka 是消息引擎嘛,这里的消息就是指 Kafka 处理的主要对象。
主题(Topic)
主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。是逻辑上的概念,生产者生产的消息可以按类别分为多个主题。消费者按主题订阅,消费自己订阅的主题下的数据。
分区(Partition)
一个有序不变的消息序列。每个主题划分成多个分区(Partition),每个分区是一组有序的消息日志。生产者生产的每条消息只会被发送到一个分区中,也就是说如果向一个双分区的主题发送一条消息,这条消息要么在分区 0 中,要么在分区 1 中。如你所见,Kafka 的分区编号是从 0 开始的,如果 Topic 有 100 个分区,那么它们的分区号就是从 0 到 99。
是物理上的概念,对于一个topic,kafka维护一个或多个分区。关于分区,还有一个replicas(副本)的概念,顾名思义就是copy版本,防止分区挂掉了,数据丢失。其中一个副本为leader,其他都为follower。leader处理分区的所有读写工作,follower会定期同步leader上的数据,如果leader挂掉了,kafka会从follower中选举出新的leader。
副本(Replica)
Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。Kafka 定义了两类副本:领导者副本(Leader Replica)和追随者副本(Follower Replica),前者对外提供服务,这里的对外指的是与客户端程序进行交互;而后者只是被动地追随领导者副本而已,不能与外界进行交互。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。副本的工作机制也很简单:生产者总是向领导者副本写消息;而消费者总是从领导者副本读消息。至于追随者副本,它只做一件事:向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步。
消息位移(Offset)
表示分区中每条消息的位置信息,是一个单调递增且不变的值。
消费者位移(Consumer Offset)
表征消费者消费进度,每个消费者都有自己的消费者位移。
offset(偏移量)
分为生产者的offset和消费者的offset。
生产者offset:不管是多少个生产者,还是我们规定了他们会写入哪一个分区,但只要他们写入的时候,一定是每一个分区都有一个offset,这个offset就是生产者的offset,同时也是这个分区的最新最大的offset。
消费者offset:某一个分区的offset情况,我们已经知道生产者写入的offset是最新最大的值也就是12,而当Consumer A进行消费时,他从0开始消费,一直消费到了9,他的offset就记录在了9,Consumer B就记录在了11。等下一次他们再来消费时,他们可以选择接着上一次的位置消费,当然也可以选择从头消费,或者跳到最近的记录并从“现在”开始消费。消费者的offset是他自己维护的,他可以选择分区最开始,最新,也可以记住他消费到哪了。
重平衡(Rebalance)
消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。
本文详细介绍了kafka相关的概念与内容。