文章分以下几个部分:kafka基础名词、使用说明、场景、原理、架构、快的原因、其它中间件共同的优化措施、面试QA等
一、kafka简介
1.1 kafka是什么
Apache Kafka是 一个分布式流处理平台
流处理平台有以下三种特性:
- 要发布(写)和订阅(读)流事件,包括来自其他系统的数据的持续导入/导出的。
- 存储持久和可靠的事件流
- 在事件发生时或追溯性地处理事件流。
Kafka可以用于两大类别的应用:
- 构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。(相当于message queue)
- 构建实时流式应用程序,对这些流数据进行转换或者影响。(就是流处理,通过kafka stream topic和topic之间内部进行变化)
1.2 历史由来
Kafka从何而来?我们为什么要开发Kafka? Kafka到底是什么?
Kafka 最初是 LinkedIn 的一个内部基础设施系统。我们发现虽然有很多数据库和系统可以用来存储数据,但在我们的架构里,刚好缺一个可以帮助处理持续数据流的组件。在开发Kafka之前,我们实验了各种现成的解决方案,从消息系统到日志聚合系统,再到ETL工具,它们都无法满足我们的需求。
最后,我们决定从头开发一个系统。我们不想只是开发一个能够存储数据的系统,比如传统的关系型数据库、键值存储引擎、搜索引擎或缓存系统,我们希望能够把数据看成是持续变化和不断增长的流,并基于这样的想法构建出一个数据系统。事实上,是一个数据架构。
这个想法实现后比我们最初预想的适用性更广。Kafka 一开始被用在社交网络的实时应用和数据流当中,而现在已经成为下一代数据架构的基础。大型零售商正在基于持续数据流改造他们的基础业务流程,汽车公司正在从互联网汽车那里收集和处理实时数据流,银行也在重新思考基于 Kafka 改造他们的基础。
1.3 历史版本
版本号 | 备注 |
---|---|
0.7 | 上古版本,提供了最基础的消息队列功能 |
0.8 | 引入了副本机制,成为了一个真正意义上完备的分布式高可靠消息队列解决方案 |
0.8.2 | 新版本 Producer API,即需要指定 Broker 地址的 Producer |
0.9 | 增加了基础的安全认证 / 权限,Java 重写了新版本消费者 API |
0.10.0.0 | 引入了 Kafka Streams |
0.11.0.0 | 提供幂等性 Producer API 以及事务(Transaction) API,对 Kafka 消息格式做了重构。 |
1.0 | Kafka Streams 的各种改进 |
2.0 | Kafka Streams 的各种改进 |
1.4 术语
- 消息:Record。这里的消息就是指 Kafka 处理的主要对象。
- 服务:Broker。一个 Kafka 集群由多个 Broker 组成,Broker 负责接收和处理客户端发送过来的请求,以及对消息进行持久化。
- 主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
- 分区:Partition。一个有序不变的消息序列。每个主题下可以有多个分区。
- 消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增且不变的值。
- 副本:Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
- 生产者:Producer。向主题发布新消息的应用程序。
- 消费者:Consumer。从主题订阅新消息的应用程序。
- 消费者位移:Consumer Offset。表征消费者消费进度,每个消费者都有自己的消费者位移。
- 消费者组:Consumer Group。多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
- 重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。
- leader: replica 中的一个角色, producer 和 consumer 只跟 leader 交互。
- follower: replica 中的一个角色,从 leader 中复制数据。
- controller: Kafka的核心组件。它的主要作用是在Apache ZooKeeper的帮助下管理和协调整个Kafka集群
- ZK: kafka 通过 zookeeper 来存储集群的 meta 信息。
- LEO:Log End Offset。日志末端位移值或末端偏移量,表示日志下一条待插入消息的位移值。举个例子,如果日志有10条消息,位移值从0开始,那么,第10条消息的位移值就是9。此时,LEO = 10。
- LSO:Log Stable Offset。这是Kafka事务的概念。如果你没有使用到事务,那么这个值不存在(其实也不是不存在,只是设置成一个无意义的值)。该值控制了事务型消费者能够看到的消息范围。它经常与Log Start Offset,即日志起始位移值相混淆,因为有些人将后者缩写成LSO,这是不对的。在Kafka中,LSO就是指代Log Stable Offset。
- AR:Assigned Replicas。AR是主题被创建后,分区创建时被分配的副本集合,副本个数由副本因子决定。
- ISR:In-Sync Replicas。Kafka中特别重要的概念,指代的是AR中那些与Leader保持同步的副本集合。在AR中的副本可能不在ISR中,但Leader副本天然就包含在ISR中。关于ISR,还有一个常见的面试题目是如何判断副本是否应该属于ISR。目前的判断依据是:Follower副本的LEO落后Leader LEO的时间,是否超过了Broker端参数replica.lag.time.max.ms值。如果超过了,副本就会被从ISR中移除。
- HW:高水位值(High watermark)。这是控制消费者可读取消息范围的重要字段。一个普通消费者只能“看到”Leader副本上介于Log Start Offset和HW(不含)之间的所有消息。水位以上的消息是对消费者不可见的。关于HW,问法有很多,我能想到的最高级的问法,就是让你完整地梳理下Follower副本拉取Leader副本、执行同步机制的详细步骤。这就是我们的第20道题的题目,一会儿我会给出答案和解析。
1.5 核心API
-
Admin API :管理和检查topic、brokers、和其它kafka对象。
The Admin API to manage and inspect topics, brokers, and other Kafka objects.
-
生产者API。发布流事件到一个或者多个kafka主题(topics)。
The Producer API to publish (write) a stream of events to one or more Kafka topics.
-
消费者API。订阅一个或多个主题,并处理产生于这些主题的流事件
- The Consumer API to subscribe to (read) one or more topics and to process the stream of events produced to them.
-
StreamsAPI允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
The Kafka Streams API to implement stream processing applications and microservices. It provides higher-level functions to process event streams, including transformations, stateful operations like aggregations and joins, windowing, processing based on event-time, and more. Input is read from one or more topics in order to generate output to one or more topics, effectively transforming the input streams to output streams.
-
ConnectorAPI,允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。
The Kafka Connect API to build and run reusable data import/export connectors that consume (read) or produce (write) streams of events from and to external systems and applications so they can integrate with Kafka.
二、使用场景
服务解耦,异步处理,限流削峰,消息驱动的系统,配合流式处理(像kafka streaming,storm flink等)做实时流计算