kafka入门介绍

kafka入门介绍

半兽人 发表于: 2015-06-16   最后更新时间: 2017-10-12  
  •    174 订阅,55829 游览

Kafka做为一个分布式的流平台,这到底意味着什么?

咱们认为,一个流处理平台具备三个关键能力:html

  1. 发布和订阅消息(流),在这方面,它相似于一个消息队列或企业消息系统。
  2. 容错的方式存储消息(流)。
  3. 在消息流发生时处理它们。
什么是kakfa的优点?

它应用于2大类应用:算法

  1. 构建实时的流数据管道,可靠地获取系统和应用程序之间的数据。
  2. 构建实时流的应用程序,对数据流进行转换或反应。

要了解kafka是如何作这些事情的,让咱们从下到上深刻探讨kafka的能力。数据库

首先几个概念:
  1. kafka做为一个集群运行在一个或多个服务器上。
  2. kafka集群存储的消息是以topic为类别记录的。
  3. 每一个消息(也叫记录record,我习惯叫消息)是由一个key,一个value和时间戳构成。
kafka有四个核心API:
  • 应用程序使用 Producer API 发布消息到1个或多个topic(主题)。
  • 应用程序使用 Consumer API 来订阅一个或多个topic,并处理产生的消息。
  • 应用程序使用 Streams API 充当一个流处理器,从1个或多个topic消费输入流,并生产一个输出流到1个或多个输出topic,有效地将输入流转换到输出流。
  • Connector API容许构建或运行可重复使用的生产者或消费者,将topic链接到现有的应用程序或数据系统。例如,一个关系数据库的链接器可捕获每个变化。

screenshot

Client和Server之间的通信,是经过一条简单、高性能而且和开发语言无关的TCP协议。而且该协议保持与老版本的兼容。Kafka提供了Java Client(客户端)。除了Java Client外,还有很是多的其它编程语言的Clientapache

首先来了解一下Kafka所使用的基本术语:

Topic

Kafka将消息种子(Feed)分门别类,每一类的消息称之为一个主题(Topic).编程

Producer

发布消息的对象称之为主题生产者(Kafka topic producer)api

Consumer

订阅消息并处理发布的消息的种子的对象称之为主题消费者(consumers)服务器

Broker

已发布的消息保存在一组服务器中,称之为Kafka集群。集群中的每个服务器都是一个代理(Broker). 消费者能够订阅一个或多个主题(topic),并从Broker拉数据,从而消费这些已发布的消息。markdown

话题和日志 (Topic和Log)

让咱们更深刻的了解Kafka中的Topic。负载均衡

Topic是发布的消息的类别或者种子Feed名。对于每个Topic,Kafka集群维护这一个分区的log,就像下图中的示例:异步

screenshot

每个分区都是一个顺序的、不可变的消息队列, 而且能够持续的添加。分区中的消息都被分了一个序列号,称之为偏移量(offset),在每一个分区中此偏移量都是惟一的。

Kafka集群保持全部的消息,直到它们过时, 不管消息是否被消费了。 实际上消费者所持有的仅有的元数据就是这个偏移量,也就是消费者在这个log中的位置。 这个偏移量由消费者控制:正常状况当消费者消费消息的时候,偏移量也线性的的增长。可是实际偏移量由消费者控制,消费者能够将偏移量重置为更老的一个偏移量,从新读取消息。 能够看到这种设计对消费者来讲操做自如, 一个消费者的操做不会影响其它消费者对此log的处理。 再说说分区。Kafka中采用分区的设计有几个目的。一是能够处理更多的消息,不受单台服务器的限制。Topic拥有多个分区意味着它能够不受限的处理更多的数据。第二,分区能够做为并行处理的单元,稍后会谈到这一点。
screenshot

分布式(Distribution)

Log的分区被分布到集群中的多个服务器上。每一个服务器处理它分到的分区。 根据配置每一个分区还能够复制到其它服务器做为备份容错。 每一个分区有一个leader,零或多个follower。Leader处理此分区的全部的读写请求,而follower被动的复制数据。若是leader宕机,其它的一个follower会被推举为新的leader。 一台服务器可能同时是一个分区的leader,另外一个分区的follower。 这样能够平衡负载,避免全部的请求都只让一台或者某几台服务器处理。

生产者(Producers)

生产者往某个Topic上发布消息。生产者也负责选择发布到Topic上的哪个分区。最简单的方式从分区列表中轮流选择。也能够根据某种算法依照权重选择分区。开发者负责如何选择分区的算法。

消费者(Consumers)

一般来说,消息模型能够分为两种, 队列和发布-订阅式。 队列的处理方式是 一组消费者从服务器读取消息,一条消息只有其中的一个消费者来处理。在发布-订阅模型中,消息被广播给全部的消费者,接收到消息的消费者均可以处理此消息。Kafka为这两种模型提供了单一的消费者抽象模型: 消费者组 (consumer group)。 消费者用一个消费者组名标记本身。 一个发布在Topic上消息被分发给此消费者组中的一个消费者。 假如全部的消费者都在一个组中,那么这就变成了queue模型。 假如全部的消费者都在不一样的组中,那么就彻底变成了发布-订阅模型。 更通用的, 咱们能够建立一些消费者组做为逻辑上的订阅者。每一个组包含数目不等的消费者, 一个组内多个消费者能够用来扩展性能和容错。正以下图所示:
screenshot2个kafka集群托管4个分区(P0-P3),2个消费者组,消费组A有2个消费者实例,消费组B有4个。

正像传统的消息系统同样,Kafka保证消息的顺序不变。 再详细扯几句。传统的队列模型保持消息,而且保证它们的前后顺序不变。可是, 尽管服务器保证了消息的顺序,消息仍是异步的发送给各个消费者,消费者收到消息的前后顺序不能保证了。这也意味着并行消费将不能保证消息的前后顺序。用过传统的消息系统的同窗确定清楚,消息的顺序处理很让人头痛。若是只让一个消费者处理消息,又违背了并行处理的初衷。 在这一点上Kafka作的更好,尽管并无彻底解决上述问题。 Kafka采用了一种分而治之的策略:分区。 由于Topic分区中消息只能由消费者组中的惟一一个消费者处理,因此消息确定是按照前后顺序进行处理的。可是它也仅仅是保证Topic的一个分区顺序处理,不能保证跨分区的消息前后处理顺序。 因此,若是你想要顺序的处理Topic的全部消息,那就只提供一个分区。

Kafka的保证(Guarantees)

  • 生产者发送到一个特定的Topic的分区上,消息将会按照它们发送的顺序依次加入,也就是说,若是一个消息M1和M2使用相同的producer发送,M1先发送,那么M1将比M2的offset低,而且优先的出如今日志中。
  • 消费者收到的消息也是此顺序。
  • 若是一个Topic配置了复制因子(replication factor)为N, 那么能够容许N-1服务器宕机而不丢失任何已经提交(committed)的消息。

有关这些保证的更多详细信息,请参见文档的设计部分。

kafka做为一个消息系统

Kafka的流与传统企业消息系统相比的概念如何?

传统的消息有两种模式:队列发布订阅。 在队列模式中,消费者池从服务器读取消息(每一个消息只被其中一个读取); 发布订阅模式:消息广播给全部的消费者。这两种模式都有优缺点,队列的优势是容许多个消费者瓜分处理数据,这样能够扩展处理。可是,队列不像多个订阅者,一旦消息者进程读取后故障了,那么消息就丢了。而发布和订阅容许你广播数据到多个消费者,因为每一个订阅者都订阅了消息,因此没办法缩放处理。

kafka中消费者组有两个概念:队列:消费者组(consumer group)容许同名的消费者组成员瓜分处理。发布订阅:容许你广播消息给多个消费者组(不一样名)。

kafka的每一个topic都具备这两种模式。

kafka有比传统的消息系统更强的顺序保证。

传统的消息系统按顺序保存数据,若是多个消费者从队列消费,则服务器按存储的顺序发送消息,可是,尽管服务器按顺序发送,消息异步传递到消费者,所以消息可能乱序到达消费者。这意味着消息存在并行消费的状况,顺序就没法保证。消息系统经常经过仅设1个消费者来解决这个问题,可是这意味着没用到并行处理。

kafka作的更好。经过并行topic的parition —— kafka提供了顺序保证和负载均衡。每一个partition仅由同一个消费者组中的一个消费者消费到。并确保消费者是该partition的惟一消费者,并按顺序消费数据。每一个topic有多个分区,则须要对多个消费者作负载均衡,但请注意,相同的消费者组中不能有比分区更多的消费者,不然多出的消费者一直处于空等待,不会收到消息

kafka做为一个存储系统

全部发布消息到消息队列和消费分离的系统,实际上都充当了一个存储系统(发布的消息先存储起来)。Kafka比别的系统的优点是它是一个很是高性能的存储系统

写入到kafka的数据将写到磁盘并复制到集群中保证容错性。并容许生产者等待消息应答,直到消息彻底写入。

kafka的磁盘结构 - 不管你服务器上有50KB或50TB,执行是相同的。

client来控制读取数据的位置。你还能够认为kafka是一种专用于高性能,低延迟,提交日志存储,复制,和传播特殊用途的分布式文件系统

kafka的流处理

仅仅读,写和存储是不够的,kafka的目标是实时的流处理。

在kafka中,流处理持续获取输入topic的数据,进行处理加工,而后写入输出topic。例如,一个零售APP,接收销售和出货的输入流,统计数量或调整价格后输出。

能够直接使用producer和consumer API进行简单的处理。对于复杂的转换,Kafka提供了更强大的Streams API。可构建聚合计算链接流到一块儿的复杂应用程序。

助于解决此类应用面临的硬性问题:处理无序的数据,代码更改的再处理,执行状态计算等。

Sterams API在Kafka中的核心:使用producer和consumer API做为输入,利用Kafka作状态存储,使用相同的组机制在stream处理器实例之间进行容错保障。

拼在一块儿

消息传递,存储和流处理的组合看似反常,但对于Kafka做为流式处理平台的做用相当重要。

像HDFS这样的分布式文件系统容许存储静态文件来进行批处理。这样系统能够有效地存储和处理来自过去的历史数据。

传统企业的消息系统容许在你订阅以后处理将来的消息:在将来数据到达时处理它。

Kafka结合了这两种能力,这种组合对于kafka做为流处理应用和流数据管道平台是相当重要的。

批处理以及消息驱动应用程序的流处理的概念:经过组合存储和低延迟订阅,流处理应用能够用相同的方式对待过去和将来的数据。它是一个单一的应用程序,它能够处理历史的存储数据,当它处理到最后一个消息时,它进入等待将来的数据到达,而不是结束。

一样,对于流数据管道(pipeline),订阅实时事件的组合使得能够将Kafka用于很是低延迟的管道;可是,可靠地存储数据的能力使得它能够将其用于必须保证传递的关键数据,或与仅按期加载数据或长时间维护的离线系统集成在一块儿。流处理能够在数据到达时转换它。

有关Kafka提供的保证,api和功能的更多信息,可继续查阅本网

  
相关文章
相关标签/搜索