Kafka是一个分布式的流处理平台,有三个关键的功能:
1. 发布/订阅消息流,类似于消息队列或者企业消息系统
2. 容错持久的消息存储
3. 实时产生数据流的处理
Kafka通常用于两大类应用程序:
1. 构建实时的流数据处理管道用来从系统或应用可靠地获取数据
2. 构建实时流处理程序以处理流数据的处理和转换
Kafka运行在跨数据中心的多个服务器上
Kafka以topics为类别存储数据流记录
每个流记录都由key,value和timestamp组成
kafka 4个核心API:
1. Producer api: 发布流记录到一个或多个kafka topics
2. consumer api: 订阅一个或者多个kafka topics 来处理流记录
3. Stream api: 流处理器,从一个topics 消费流记录并且在topics上产生新的流记录。将输入流转换为输出流
4. Connector api:构建和运行可重用的生产者或消费者,将Kafka主题与现有的应用程序或数据系统连接起来。例如,一个关系数据库的连接器可能捕获到一个表的每一个变更
Topics and Logs
Topic是消息被发布的类别,kafka中主题一般有多个订阅者,也就是说,一个主题可以有一个或者多个消费者
对于每个topics,kafka集群都维护者一个分区日志。
partition
每个分区都是一个有序的、不可变的记录序列,它不断被附加到结构化的提交日志中。分区中的记录都分配了一个名为offset的序列id号,它惟一地标识分区中的每个记录
Kafka集群持续地保存所有已发布的记录——不管它们是否被使用过——使用一个可配置的保留期
在每个消费者基础上保留的唯一元数据是日志中的消费者的偏移量或位置。这个偏移量是由消费者控制的。这种特性的组合意味着Kafka的消费者非常便宜——他们可以在不影响集群或其他消费者的情况下来回走
日志中的分区有几个用途。首先,它们允许日志的规模超出了适合单个服务器的大小。每个单独的分区必须适合承载它的服务器,但是一个主题可能有多个分区,因此它可以处理任意数量的数据。第二,它们作为并行的单元——更多地在这一点上。
值得注意的是:
- 在实现上都是以每个Partition为基本实现单元的。
- 消费时,每个消费线程最多只能使用一个partition。
- 一个topic中partition的数量,就是每个user group中消费该topic的最大并行度数量
Kafka MirrorMaker
MirrorMaker就是kafka生产者与消费者的一个整合,通过consumer从源Kafka集群消费数据,然后通过producer将数据重新推送到目标Kafka集群
Producers
生产者将数据发布到他们选择的主题中。生产者负责选择在主题中分配给哪个分区的记录
Consumers
Consumer Group
同一个topic,每个group都可以拿到同样的所有数据,但是数据进入group后只能被其中的一个worker消费。group内的worker可以使用多线程或多进程来实现,也可以将进程分散在多台机器上,worker的数量通常不超过partition的数量,且二者最好保持整数倍关系,因为Kafka在设计时假定了一个partition只能被一个worker消费(同一group内)
理解consumer group记住下面这三个特性就好了:
1)consumer group下可以有一个或多个consumer instance,consumer instance可以是一个进程,也可以是一个线程
2)group.id是一个字符串,唯一标识一个consumer group
3)consumer group下订阅的topic下的每个分区只能分配给某个group下的一个consumer(当然该分区还可以被分配给其他group)