kafka对于构建实时的数据管道和流应用是很有用的。
Apache Kafka是一个分布式的流平台。这是什么意思呢?
我们考虑流平台有三个关键的能力:
它可以发布订阅流。这一点和消息队列或者企业消息系统很类似。
它可以存储流,并且可以容错。
它可以处理流
Kafa有什么用呢?
它被用于两类应用:
在系统和应用之间构建实时的流管道
构建实时的流应用
那么Kafka是怎样做到这些事情的呢?
首先来看一些概念:
Kafka是以集群方式运行的
Kafka集群将流记录存储在被叫做topics的分类中
每一条记录由一个key,一个value和一个timestamp组成
Kafka有四个核心的API:
Producer API允许一个应用发布一条流记录到一个或者多个topics中
Consumer API允许一个应用订阅一个或多个topics,并且处理记录流
Streams API允许一个应用充当流处理器的角色,从一个或多个topics那里消费一个输入流并且生产一个输出流到一个或多个topics,有效的将输入流转换为输出流
Connector API允许构建并运行可重用的可以将Kafka连接到已存在的应用或者数据系统上的producer或者consumer。例如,连接关系型数据库。
在Kafka中,客户端和服务器端的通信被做成是简单的、高性能的、基于TCP协议的。
Topics and Logs让我们首先深入到核心抽象,Kafka提供a stream of records —— the topic
一个topic是一个分类,记录是被发布到这里面的。在Kafka中,topics总是有多个订阅者的;因此,一个topic可以有多个0个,1个,或者多个消费者来订阅的。
每个topic,Kafka集群维护一个partitioned log(分区日志),它们看起来是这个样子的:
每个分区都是一个有序的、不可变的序列,这些序列都是结构化的提交日志。分区中的每个记录都被指定了一个序列id编号,被称之为offset,而且它是分区中每条记录的唯一标识。
Kafka集群操持所有的发布记录,无论这些记录是否已经被消费,这一点是可以配置的。例如,如果这个保留策略设置的是2天,那么一个记录被发布过了2天以后它仍然可以被消费,但是为了腾出空间来,它可能会被丢弃。Kaka的性能是高效的稳定的,所有存储数据很长时间不是一个问题。
事实上,元数据是保存在每个消费者那里的,最基本的是offset或者叫position,它们都是以消费者日志形式保存的。offset是由消费者来控制的:通常一个消费者会增长它的偏移量,事实上,自从消费者可以控制位置它可以以任意顺序消费记录。例如,一个消费者可以重置到一个旧的offset以处理之前的记录。
这个特性就意味着,kafka的消费者是非常廉价的 —— 它们可以来去自如而不受集群和其它消费者的影响。
日志分区有几个目的。第一,允许日志是伸缩的,大小可以超过单个服务器,每一个独立的分区必须安装在它所在主机的那个服务器上,但是一个topic可以有多个分区,所有它可以处理任意数量的数据。第二,作为一个并行单元。
Distribution日志分区是被分布在集群中的服务器上的,每个服务器处理数据和请求都共享这些分区。为了容错,每个分区会交叉复制,副本的数据是可以配置的。
每个分区中有一个服务器充当“leader”,有0个或者多个服务器充当“followers”。leader处理所有的读和写请求,而follower被动的从leader那里复制。如果leader失败了,其中一个follower将自动成为新的leader。每个充当leader的服务器可能是一些分区的leader,同时又是另一些分区的follower,所以在集群中负载是平衡的。
Producers生成者发布数据到topics。生产者负责选择哪个记录指定到哪个分区。可以以一个轮询的方式简单的来实现负载均衡。
Consumers消费者用一个“consumer group name”来标记它们自己,topic中的每个记录被投递到一个订阅者消费组中的一个消费者实例。每个消费者实例分开处理。
如果所有的消费者实例都在相同的消费者组中,那么记录有效的在消费者之间负载均衡。
如果所有的消费者实例在不同的消费者组中,那么每一条记录都会被广播给所有的消费者。