是一个分布式流平台。应具有的三个功能
-
发布和订阅记录的流,类似于消息队列或者企业级消息系统。
-
以容错的、持久的方式存储记录流
-
当发生时处理记录流。
kafka一般使用于两大类应用:
-
构建实时流数据管道:在系统或应用间可靠的得到数据。
-
构建转换或响应实时数据流的应用。
概念
-
kafka作为一个集群运行在一个或多台服务器上,可以跨多个数据中心。
-
topic :分类的存储记录流
-
每一个record 持有一个key、一个value、和一个时间戳timestamp.
Kafka有四个核心APIs:
-
Producer API 允许应用发布一个消息流到一个或多个topic
-
Consumer API 订阅一个或多个topic和处理为他们生产的消息流
-
Stream API 应用扮演一个流处理系统,消费一个从一个或多个topic的输入流,为了一个或多个输出topic生产一个输出流,有效地将输入流转换为输出流
-
Connector API 构建和运行高可用的生产者或消费者:连接kafka topic 到存在的应用或数据中心。例如,关系型数据库的连接器可能捕获表的每一个更改。
在kafka中客户端和服务端的连接是通过一个简单的、高性能的、无关语言的TCP协议连接,进行了版本控制、向后兼容旧版本,提供了一个JAVA client。客户端有过个语言
topic 和 log
一个topic 是一个分类或名称为发布的消息流,topic可以有0个、1个或多个消费者(订阅写入其中的数据)
为每一个topic,kafka集群维护一个分区日志。
每一个分区是有序的、不可变的消息序列(持续添加到一个结构化的提交日志),每一个消息被安排了一个序列号:偏移量(offset) 标记一个分区中唯一
kafka持久化发布的消息,无论是否消费-使用可配置的保留期,比如设置为两天,可用于消费,之后丢弃腾出空间,kafka的性能是不变的,对应数据的大小,长时间存储不是问题。
消费者保存的元数据只是offset或消费者在日志中的位置,偏移量是由消费者控制的:当读取消息时会线性地增加偏移量,实际上,消费者可以任意地消费消息,比如时间最早的或者最近的消息。
日志中的分区有几个目的,允许日志的规模超出单个服务器,每一个单独的分区适合承载他的服务器,一个主题可能有多个分区,可以处理任意数量的数据。他们是并行的单位。
分布式
日志中的分区都在kafka服务器上,每个服务器处理数据和请求共享分区。每个分区在可配置数量的服务器上复制,已进行容错。
异地备份
MirrorMaker 提供了异地备份,消息通过多个数据中心或云区域备份,你可以在主动/被动场景中备份和恢复,或者放置数据离你的用户更近,或支持数据本地需求。
生产者
发布消息到选择的主题中,负责将消息安排到主题的哪个分区中,可以通过轮询的方式,为了负载均衡,或者可以通过有语义的函数,更多的是使用一秒内的分区。
消费者
消费者通过组名称标识它们,每一条消息发布到主题中的消费者组中的一个消费者实例,消费者实例可以在不同的进程或者机器上。
如果所有消费者是一个组,消息能有效地负载均衡
如果所有消费者不同组,每一条消息会被广播到所有的消费者进程。
消费的实现方式是通过分割日志分区给消费者实例,为了每一个实例在任何时间点上‘公平分享’分区,这种组的关系通过kafka协议动态地处理,如果新实例加入组中,会接管一部分其他实例的分区,如果一个分区死了,也会有其他分区接管。
多用途
可以通过配置实现多用途,一个主题可以生产和消费数据,也有操作支持分配,控制客户端的资源。
保证
-
生产者发送消息到独特的主题分区中,按顺序拼接,比如消息M1,并且作为M2,先发 M1,后发M2,M1有更低的偏移量,更早出现在日志中。
-
消费者按照存储在日志中的顺序发现消息。
-
一个主题有N个备份,容忍N-1个服务器down掉,不丢失任何提交到日志中的消息。
作为消息系统
与传统消息中间件相比如何?
传统消息中间件有两种模式:队列和发布订阅。队列中,每一条消息发送给一个消费者,而发布订阅发布给每个消费者,分别有优点和缺点。队列的优势是允许分配处理数据通过多个消费实例,可以扩展。缺点是不是多个订阅者,一旦消息消费了就没了,
kafka组的概念包含了上面两个概念。作为队列允许通过组分配处理,作为发布订阅,允许将消息广播到多个消费者组。
kafka的模式的有点是-既可以扩展,也可以广播
kafka有比传统方式更健壮的顺序保证。
传统的队列模式按顺序存储消息,如果多个消费者消费,服务器按顺序分发消息。尽管按顺序分发,消息异步的传递到消费者,可能会不按顺序到达不同的消费者,
并行的消费中,消息的顺序丢失了,消息系统通过独家消费,只允许一个进程消费队列,意味着没有并行。
kafka做的更好,允许并行,主题中的分区,提供双重的顺序保证和负载均衡,通过消费者进程池,主题中的分区分配给消费者组,每一个分区被消费者组中的一个消费者实例消费。消费者唯一的读取分区并且按顺序消费数据,注意:在一个组中,消费者实例不能比分区多。
存储系统
消息队列允许解耦合,一般作为消息空中存储。
数据写到硬盘中并且为了容错备份,kafka允许生产者等待确认,写入不会被认为是完整的直到完全备份和保证服务器写失败仍然持久化。
扩容的表现好,不管你有50KB还是50TB,表现一样。
允许客户端控制读取位置,可以将kafka看做是特殊用途的分布式文件系统,用于高性能、低延迟的提交日志存储、复制和传播。
处理流
仅仅读取、写和存储数据流是不够的,目的是实时处理流。
流处理器,从输入流中获取流数据,在其上处理,并将数据生产到输出流。
比如,零售应用,销售和发货作为输入流,输出重新排序和价格的流。
简单的处理可以用生产者和消费者API,复杂的可以使用流API,处理不一般的数据,计算流或连接流的聚合。
拼接
传递、存储、处理流的结合可能看起来不同寻常,但对于kafka来说是基本的。
分布式的文件系统比如HDFS,存储静态资源为了批处理,实际上这样的系统可以存储和处理过去的历史数据。
传统的企业级消息系统允许订阅后接受未来的消息。
可以做流应用和流数据管道。
作为流数据管道,将订阅与实时的事件结合,可以做低延迟的管道。可靠的存储使它能在重要的数据场合使用,或者在离线系统加载数据