前言
在之前的文章中已经介绍了什么是消息队列以及为什么使用消息队列。本篇文章就来介绍一下当今市面上比较流行的一款消息队列-kafka,虽然是基础内容但对后续的学习非常重要。
一、kafka概述
kafka是⼀种高吞吐量、分布式、基于发布/订阅的消息系统,最初由 LinkedIn 公司开发,使用Scala 语⾔编写,目前是 Apache 的开源项目。
Kafka的几大特性:
- ⾼性能:以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
- 持久性:消息最终被持久化到磁盘,且提供数据备份机制防止数据丢失。
- 容错性:⽀持集群节点故障容灾恢复,即使 Kafka 集群中的某⼀台 Kafka 服务节点宕机,也不会影响整个系统的功能。
- ⾼并发:可以⽀撑数千个客户端同时进⾏读写操作。
kafka的应用场景:
- 日志收集方向:可以用 Kafka 来收集各种服务的 log。
- 消息系统方向:Kafka 具备解耦、冗余、削峰、异步、容错性等功能。
- 大数据实时计算方向::Kafka 提供了⼀套完整的流式处理框架, 被广泛应用到大数据处理,如与 flink、 spark、storm 等整合。
二、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 集群, 集群向消费者提供消息。
三、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采用Pull模式还是Push模式
kafka最初考虑的问题是, consumer应该从 brokes 拉取消息还是 brokers 将消息推送到 consumer,也就是 pull 还是 push。
push模式的缺点:
- 由 broker 决定消息推送的速率,对于不同消费速率的 consumer 就不太好处理了。消息系统都致力于让 consumer 以最⼤的速率最快速的消费消息,但不幸的是, push 模式下,当 broker 推送的速率远大于 consumer 消费的速率时,consumer 怕就要崩溃了。
- Push 模式必须在不知道下游 consumer 消费能⼒和消费策略的情况下决定是⽴即推送每条消息还是缓存之后批量推送。 为了避免 consumer 崩溃而采用较低的推送速率,将可能导致⼀次只推送较少的消息而造成浪费。
在这方面, Kafka 遵循了⼀种大部分消息系统共同的传统的设计:producer 将消息推送到 broker, consumer 从 broker 拉取消息 。
优点:consumer 可以⾃主决定是否批量的从 broker 拉取数据consumer 可以根据自己的消费能力去决定这些策略
缺点:如果 broker 没有可供消费的消息,将导致 consumer 不断在循环中轮询。
总结
本篇主要了kafka的基本概念以及kafka的特性以及应用场景,同时还介绍了kafka中主题分区副本的概念,这几个概念非常重要,是后续学习和上手kafka的基础,一定要理解。