在之前的文章中已经介绍了什么是消息队列以及为什么使用消息队列。本篇文章就来介绍一下当今市面上比较流行的一款消息队列-kafka,虽然是基础内容但对后续的学习非常重要。
kafka是⼀种高吞吐量、分布式、基于发布/订阅的消息系统,最初由 LinkedIn 公司开发,使用Scala 语⾔编写,目前是 Apache 的开源项目。
Kafka的几大特性:
kafka的应用场景:
Broker | Kafka 服务器,负责消息存储和转发 |
---|---|
Topic | 消息类别, Kafka 按照 topic 来分类消息 |
Partition | topic 的分区,⼀ 个 topic 可以包含多个 partition, topic 消息保存在各个 partition 上 |
Offset | 消息在⽇志中的位置,可以理解是消息在 partition 上的偏移量,也是代表该消息的唯⼀序号 |
Producer | 消息⽣产者,向 Kafka Broker 发消息的客户端 |
Consumer | 消息消费者,从 Kafka Broker 读消息的客户端。 |
ConsumerGroup | 消费者分组,每个 Consumer 必须属于⼀个 group |
Zookeeper | 保存着集群 broker、 topic、 partition 等 meta 数据;另外,还负责 broker 故障发现,partition leader 选举,负载均衡等功能。 |
Kafka 的设计时什么样的?
答:Kafka 将消息以 topic 为单位进行归纳,将向 Kafka topic 发布消息的程序成为 producers.,将预订 topics 并消费消息的程序成为 consumer。
Kafka 以集群的方式运行,可以由⼀个或多个服务组成,每个服务叫做一个 broker,producers 通过网络将消息发送到 Kafka 集群, 集群向消费者提供消息。
主题(topic):在kafka中是⼀个逻辑的概念,kafka通过topic将消息进行分类,不同的topic会被订阅该topic的消费者消费。
但是有⼀个问题,如果说这个topic中的消息非常非常多,多到需要几T来存,因为消息是会被保存到log日志文件中的。为了解决这个⽂件过大的问题,kafka提出了Partition分区的概念。
分区:⼀个 topic 可以包含多个 partition, topic 消息保存在各个 partition 上,这样可以解决统⼀存储文件过大的问题,同时提供了读写的吞吐量,读和写可以同时在多个分区中进行。
副本:副本是为了为主题中的分区创建多个备份,多个副本保存在kafka集群的多个broker中,会有⼀个副本作为leader,其他是follower。
leader:kafka的写和读的操作,都发⽣在leader上。leader负责把数据同步给follower。当leader挂了,经过主从选举,从多个follower中选举产⽣⼀个新的leader。
follower:接收leader的同步的数据。
isr:leader 会维护⼀个与其基本保持同步的列表,该列表称为 ISR(in-sync Replica),每个 Partition 都会有⼀个 ISR,而且是由leader动态维护 ,如果⼀个 follower 比⼀个 leader 落后太多,或者超过⼀定时间未发起数据复制请求,则 leader 将其重 ISR中移除 。
下面一张图展示了主题,分区和副本的关系。这是一个kafka集群,由三个节点(broker)组成,同时有一个主题A,这个主题A有3个分区(0,1,2),每个分区有2个副本(一个leader,一个follower)。
现在来小结一下主题、分区和副本的关系,这三个概念非常重要:集群中有多个broker,创建主题时可以指明主题有多个分区(把消息拆分到不同的分区中存储),可以为分区创建多个副本,不同的副本存放在不同的broker里。
kafka最初考虑的问题是, consumer应该从 brokes 拉取消息还是 brokers 将消息推送到 consumer,也就是 pull 还是 push。
push模式的缺点:
在这方面, Kafka 遵循了⼀种大部分消息系统共同的传统的设计:producer 将消息推送到 broker, consumer 从 broker 拉取消息 。
优点:consumer 可以⾃主决定是否批量的从 broker 拉取数据consumer 可以根据自己的消费能力去决定这些策略
缺点:如果 broker 没有可供消费的消息,将导致 consumer 不断在循环中轮询。
本篇主要了kafka的基本概念以及kafka的特性以及应用场景,同时还介绍了kafka中主题分区副本的概念,这几个概念非常重要,是后续学习和上手kafka的基础,一定要理解。