kafka 简介
什么是Kafka?
KafKa是一款由 Apache 软件基金会开源,使用 Scala 编写的一个 高吞吐 分布式
发布 - 订阅 消息系统 和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端点传递到另一个端点。
Kafka适合 离线 和 在线 消息消费。 Kafka消息保留在磁盘上,并在群集内复制以防止数据丢失。 Kafka构建在ZooKeeper同步服务之上。 它与Apache Spark Streaming 非常好地集成,用于实时流式数据分析。
概念介绍
-
Broker
Kafka集群包含一个或多个服务器,这种服务器被称为 broker -
Producer
负责发布消息到 Kafka broker,在发送消息之前,会对消息进行分类,即Topic。 -
Topic
每条发布到 Kafka 集群的消息都有一个主题,这个主题被称为Topic。通过对消息指定主题可以将消息分类(物理上不同 Topic 的消息分开存储,逻辑上一个 Topic 的消息虽然保存于一个或多个broker 上 但用户只需指定消息的 Topic 即可生产或消费数据而不必关心数据存于何处) -
Partition
Partition是物理上的概念,每个Topic包含一个或多个Partition -
Consumer
消息消费者,向Kafka broker读取消息的客户端。通过对消息指定主题可以将消息分类,消费者可以只关注自己需要的Topic中的消息 -
Consumer Group
每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)
消息传输流程
上图展示了两个 producer 发送了分类为 topic1 的消息,另外一个 producer 发送了 topic2 的消息。
从上图中就可以看出同一个 Topic 下的消费者和生产者的数量并不是对应的。
kafka 服务器消息存储策略
谈到kafka的存储,就不得不提到分区,即partitions,创建一个topic时,同时可以指定分区数目,分区数越多,其吞吐量也越大,但是需要的资源也越多,同时也会导致更高的不可用性,kafka在接收到生产者发送的消息之后,会根据均衡策略将消息存储到不同的分区中。
在每个分区中,消息以顺序存储,最晚接收的的消息会最后被消费。
生产者在向kafka集群发送消息的时候,可以通过指定分区来发送到指定的分区中。
也可以通过指定均衡策略来将消息发送到不同的分区中。
如果不指定,就会采用默认的随机均衡策略,将消息随机的存储到不同的分区中。
与 consumer 的交互
在消费者消费消息时,kafka使用 offset 来记录当前消费的位置。
在kafka的设计中,可以有多个不同的group来同时消费同一个topic下的消息,如图,我们有两个不同的group同时消费,他们的的消费的记录位置offset各不项目,不互相干扰。
对于一个group而言,消费者的数量不应该多余分区的数量,因为在一个group中,每个分区至多只能绑定到一个消费者上,即一个消费者可以消费多个分区,一个分区只能给一个消费者消费
因此,若一个group中的消费者数量大于分区数量的话,多余的消费者将不会收到任何消息。