Kafka 简介入门
# Kafka 简介
Kafka 官网: https://kafka.apache.org/ (opens new window)
Spring-Kafka: https://docs.spring.io/spring-kafka/reference/html/ (opens new window)
Kafka是由Apache软件基金会 (opens new window)开发的一个开源流处理平台,由Scala (opens new window)和Java (opens new window)编写。Kafka是一种高吞吐量的分布式 (opens new window)发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览 (opens new window),搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop (opens new window)一样的日志 (opens new window)数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop (opens new window)的并行加载机制来统一线上和离线的消息处理,也是为了通过集群 (opens new window)来提供实时的消息。
# KafKa 特性
# 1. 同时为发布和订阅提供高吞吐量
Kafka 的设计目标是以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对TB 级以上数据也能保证常数时间的访问性能。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条消息的传输。
# 2. 消息持久化
将消息持久化到磁盘,因此可用于批量消费,例如 ETL 以及实时应用程序。通过将数据持久化到硬盘以及 replication 防止数据丢失。
# 3. 分布式
支持 Server 间的消息分区及分布式消费,同时保证每个 partition 内的消息顺序传输。这样易于向外扩展,所有的producer、broker 和 consumer 都会有多个,均为分布式的。无需停机即可扩展机器。
# 4. 消费消息采用 pull 模式
消息被处理的状态是在 consumer 端维护,而不是由 server 端维护,broker 无状态,consumer 自己保存 offset。
# 5. 支持 online 和 offline 的场景。
同时支持离线数据处理和实时数据处理。
# 名词术语解释
可以参考下面这张图来理解
# 1. Broker
Kafka 集群中的一台或多台服务器统称为 Broker。
# 2. Topic
主题。每条发布到 Kafka 的消息都有一个类别,这个类别被称为 Topic 。(物理上不同 Topic 的消息分开存储。逻辑上一个 Topic 的消息虽然保存于一个或多个 Broker 上,但用户只需指定消息的 Topic 即可生产或消费数据而不必关心数据存于何处)。
# 3. Record
消息。Kafka 作为一个消息引擎,这里的消息就是指 Kafka 处理的主要对象。
# 4. Offset
消息位移。 表示分区中每条消息的位置信息,是一个单调递增且不变的值。
生产者向分区写入消息,每条消息在分区中的位置信息由一个叫位移(Offset)的数据来表征。 分区位移总是从 0 开始,假设一个生产者向一个空分区写入了 10 条消息,那么这 10 条消息的位移依次是 0、1、2、......、9。
# 5. Partition
分区。 Topic 物理上的分组,一个 Topic 可以分为多个 Partition ,每个 Partition 是一个有序的队列。Partition 中的每条消息都会被分配一个有序的 id(offset)。
# 6. Replica
副本。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
# 7. Producer
生产者。 消息和数据的生产者,可以理解为往 Kafka 发消息的客户端(应用程序)。
# 8. Consumer
消费者。 消息和数据的消费者,可以理解为从 Kafka 取消息的客户端(应用程序)。
# 9. Consumer Offset
消费者位移。 表征消费者消费进度,每个消费者都有自己的消费者位移。
# 10. Consumer Group
消费者组。每个 Consumer 属于一个特定的 Consumer Group(可为每个 Consumer 指定Group Name,若不指定 Group Name 则属于默认的 Group)。
这是 Kafka 用来实现一个 Topic消息的广播(发给所有的 Consumer )和单播(发给任意一个 Consumer )的手段。 一个 Topic 可以有多个 Consumer Group。
Topic 的消息会复制(不是真的复制,是概念上的)到所有的 ConsumerGroup, 但每个 Consumer Group 只会把消息发给该 Consumer Group 中的一个 Consumer。
如果要实现广播,只要每个 Consumer 有一个独立的 Consumer Group 就可以了。
如果要实现单播只要所有的 Consumer 在同一个 Consumer Group 。
用 Consumer Group 还可以将 Consumer 进行自由的分组而不需要多次发送消息到不同的 Topic 。
# 11. Rebalance
重平衡。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。