咱们认为流媒体平台具备三个关键功能:html
什么是卡夫卡好?web
它被用于两大类的应用程序:数据库
要了解卡夫卡如何作这些事情,让咱们深刻探索卡夫卡的能力。apache
首先几个概念:后端
卡夫卡有四个核心API:api
在Kafka中,客户端和服务器之间的通讯是经过一个简单的,高性能的,与语言无关的TCP协议完成的。这个协议是版本化的,并保持与旧版本的向后兼容性。咱们为Kafka提供了一个Java客户端,但客户端可使用多种语言。bash
让咱们先深刻核心抽象Kafka提供了一个记录流 - 主题。服务器
主题是要将记录发布到的类别或供稿源名称。卡夫卡的话题老是多用户的; 也就是说,一个主题能够有零个,一个或多个订阅写入数据的消费者。负载均衡
对于每一个主题,Kafka集群维护一个分区日志,以下所示:异步
每一个分区是一个有序的,不可变的记录序列,不断追加到结构化的提交日志中。分区中的记录每一个分配一个连续的id号,称为偏移量,用于惟一标识分区内的每条记录。
Kafka集群使用可配置的保留期限来保留全部已发布的记录(不管是否已被使用)。例如,若是保留策略设置为两天,则在记录发布后的两天内,保留策略可供使用,以后将被丢弃以腾出空间。卡夫卡的性能在数据大小方面是有效的,因此长时间存储数据不成问题。
实际上,以消费者为单位保留的惟一元数据是消费者在日志中的偏移或位置。这个偏移量是由消费者控制的:消费者一般会在读取记录时线性地推动其偏移量,但事实上,因为消费者的位置是由消费者控制的,因此它能够以任何喜欢的顺序消费记录。例如,消费者能够重置为较旧的偏移量以从新处理来自过去的数据,或者跳至最近的记录并从“now”开始消费。
这些功能的组合意味着卡夫卡的消费者很是便宜 - 他们能够来来去去,对集群或其余消费者没有太大的影响。例如,您可使用咱们的命令行工具来“尾巴”任何主题的内容,而不会改变现有的使用者所使用的内容。
日志中的分区有几个用途。首先,它们容许日志的大小超出适合单个服务器的大小。每一个单独的分区必须适合托管它的服务器,可是一个主题可能有许多分区,所以它能够处理任意数量的数据。其次,它们做为并行的单位 - 更多的是在一点上。
日志的分区分布在Kafka集群中的服务器上,每一个服务器处理数据和请求共享分区。每一个分区都经过可配置数量的服务器进行复制,以实现容错。
每一个分区有一个服务器充当“领导者”,零个或多个服务器充当“追随者”。领导处理分区的全部读取和写入请求,而追随者被动地复制领导。若是领导失败,其中一个追随者将自动成为新领导。每一个服务器充当其中一些分区的领导者和其余人的追随者,所以负载在集群内平衡良好。
生产者发布数据到他们选择的主题。生产者负责选择哪一个记录分配给主题内的哪一个分区。这能够以循环的方式完成,只是为了平衡负载,或者能够根据某些语义分区功能(例如基于记录中的某个键)来完成。更多关于使用分区在第二!
消费者用消费者组名称标记本身,而且发布到主题的每一个记录被传递到每一个订阅消费者组中的一个消费者实例。消费者实例能够在不一样的进程中或在不一样的机器上。
若是全部消费者实例具备相同的消费者组,则记录将有效地在消费者实例上进行负载均衡。
若是全部消费者实例具备不一样的消费者组,则每一个记录将被广播给全部消费者进程。
两个服务器Kafka集群托管四个分区(P0-P3)与两个消费者组。消费者组A有两个消费者实例,而组B有四个消费者实例。
然而,更广泛的是,咱们发现话题中有少许消费群体,每一个“逻辑用户”都有一个消费群体。每一个组由许多消费者实例组成,具备可扩展性和容错性。这不过是发布 - 订阅语义,订阅者是一群消费者而不是一个进程。
在Kafka中实现消费的方式是将日志中的分区划分为消费者实例,以便每一个实例在任什么时候间点都是“公平分享”分区的惟一消费者。这个维护组中成员资格的过程是由Kafka协议动态地处理的。若是新实例加入组,他们将接管来自组中其余成员的一些分区; 若是一个实例死亡,其分区将分配给其他的实例。
卡夫卡只提供一个分区内的记录总数,而不是主题中的不一样分区之间。每一个分区排序与按键分区数据的能力相结合,足以知足大多数应用程序的需求。可是,若是您须要所有订单而不是记录,则能够经过仅具备一个分区的主题来实现,但这意味着每一个消费者组只有一个消费者进程。
在一个高层次的卡夫卡提供如下保证:
有关这些保证的更多细节在文档的设计部分给出。
卡夫卡的流概念如何与传统的企业消息传递系统相比较?
消息传统上有两种模式:排队和发布 - 订阅。在队列中,消费者池能够从服务器读取而且每一个记录都转到其中的一个; 在发布 - 订阅记录被广播给全部消费者。这两种模式都有其优势和缺点。排队的优点在于它容许您将数据处理划分为多个消费者实例,这样能够扩展处理。不幸的是,队列不是多用户的,一旦一个进程读取了数据,发布 - 订阅容许您将数据广播到多个进程,但没法进行扩展处理,由于每条消息都发送给每一个订阅者。
卡夫卡的消费群体概念归纳了这两个概念。与队列同样,消费者组容许您将一系列流程(消费者组的成员)的处理分开。与发布 - 订阅同样,Kafka容许您向多个消费者群体广播消息。
Kafka模型的优势是每一个主题都具备这些属性 - 它能够扩展处理,也能够是多用户 - 不须要选择其中一个。
Kafka也比传统的消息系统有更强的订单保证。
传统队列在服务器上按顺序保留记录,而且若是多个使用者从队列中消耗,则服务器按照它们存储的顺序来提交记录。可是,虽然服务器按顺序提交记录,可是记录是异步传递给消费者的,因此它们可能会针对不一样的消费者而出现故障。这实际上意味着记录的排序在并行消耗的状况下丢失。消息传递系统一般具备“排他消费者”的概念,只容许一个进程从队列中消费,但这固然意味着在处理过程当中没有并行性。
卡夫卡作得更好。经过在主题内部具备并行性概念 - 分区概念,Kafka可以提供订单保证和负载平衡。这是经过将主题中的分区分配给使用者组中的使用者来实现的,以便每一个分区仅由组中的一个使用者使用。经过这样作,咱们确保消费者是该分区的惟一读者,并按顺序使用这些数据。因为有不少分区,这仍然能够平衡许多消费者实例的负载。但请注意,消费群组中的消费者实例不能多于分区。
任何容许将消息发布出去的消息队列均可以充当存储系统。Kafka的不一样之处在于它是一个很是好的存储系统。
写入Kafka的数据写入磁盘并进行复制以实现容错。Kafka容许生产者等待确认,以便在彻底复制以前写入不被认为是完整的,而且即便写入的服务器失败也能保证持续。
Kafka的磁盘结构使用了很好的规模 - 不管您在服务器上有50 KB仍是50 TB的持久性数据,Kafka都会执行相同的操做。
因为认真考虑存储并容许客户端控制其读取位置,因此能够将Kafka视为专用于高性能,低延迟提交日志存储,复制和传播的专用分布式文件系统。
有关Kafka提交日志存储和复制设计的详细信息,请阅读此页面。
只读取,写入和存储数据流是不够的,目的是启用流的实时处理。
在Kafka中,流处理器是指从输入主题获取连续数据流,对该输入执行一些处理,并产生连续数据流以输出主题的任何东西。
例如,零售应用程序可能会接受销售和发货的输入流,并输出一系列从新排序和对这些数据进行计算的价格调整。
直接使用生产者和消费者API能够作简单的处理。可是对于更复杂的转换,Kafka提供了一个彻底集成的Streams API。这容许构建应用程序进行非平凡的处理,从而计算聚合关闭流或将流链接在一块儿。
这个工具备助于解决这类应用程序面临的难题:处理乱序数据,从新处理代码更改的输入,执行有状态的计算等等。
流API基于Kafka提供的核心原语构建:它使用生产者和消费者API进行输入,使用Kafka进行有状态存储,并在流处理器实例之间使用相同的组机制来实现容错。
消息传递,存储和流处理的这种组合看起来很不寻常,但对于Kafka做为一个流媒体平台来讲,这是很是重要的。
像HDFS这样的分布式文件系统容许存储用于批处理的静态文件。有效地,这样的系统容许存储和处理过去的历史数据。
传统的企业消息传递系统容许处理未来订阅的消息。以这种方式构建的应用程序在到达时处理未来的数据。
Kafka结合了这两种功能,而且这两种组合对于Kafka用做流式传输应用程序平台和流式传输数据管道都是相当重要的。
经过将存储和低延迟订阅相结合,流式应用程序能够一样的方式处理过去和将来的数据。这是一个单一的应用程序能够处理历史,存储的数据,而不是结束,当它达到最后一个记录,它能够继续处理将来的数据到达。这是流处理的归纳概念,包括批处理以及消息驱动的应用程序。
一样,对于流式传输数据流水线,订阅实时事件的组合使得能够将Kafka用于很是低延迟的流水线; 可是可靠地存储数据的能力能够将其用于必须保证数据交付的关键数据,或者与只能按期加载数据的离线系统集成,或者可能长时间停机进行维护。流处理设施能够在数据到达时进行转换。
根据咱们的经验,消息传递的使用每每是相对较低的吞吐量,但可能须要较低的端到端延迟,而且一般取决于Kafka提供的强大的持久性保证。
在这个领域,Kafka与传统的消息系统(如ActiveMQ或 RabbitMQ)至关。
活动跟踪一般是很是高的量,由于为每一个用户页面视图生成许多活动消息。
Kafka能够做为分布式系统的一种外部提交日志。日志有助于复制节点之间的数据,并做为失败节点恢复数据的从新同步机制。Kafka中的日志压缩功能有助于支持这种用法。在这个用法中,Kafka与Apache BookKeeper项目相似。
一、下载并解压
>
tar
-xzf kafka_2.10-0.8.1.1tgz
>
cd
kafka_2.10-0.8.1.1
二、启动服务器
Kafka使用ZooKeeper,所以若是您尚未ZooKeeper服务器,则须要先启动ZooKeeper服务器。您可使用与kafka一块儿打包的便捷脚原本获取快速而简单的单节点ZooKeeper实例。
bin
/zookeeper-server-start
.sh config
/zookeeper
.properties
如今另起一个终端启动Kafka服务器:
bin
/kafka-server-start
.sh config
/server
.properties
三、另起一个窗口建立一个主题
咱们用一个分区和一个副本建立一个名为“test”的主题
bin
/kafka-topics
.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic
test
咱们如今能够看到这个话题,若是咱们运行列表主题命令:
bin
/kafka-topics
.sh --list --zookeeper localhost:2181
四、发送一些消息
Kafka带有一个命令行客户端,它将从文件或标准输入中获取输入,并将其做为消息发送到Kafka集群。默认状况下,每行将做为单独的消息发送。
运行生产者,而后在控制台输入一些消息发送到服务器。
bin
/kafka-console-producer
.sh --broker-list localhost:9092 --topic
test
五、启动两个用户
卡夫卡也有一个命令行消费者,将消息转储到标准输出。
bin/kafka-console-consumer.sh --zookeeper localhost:2181 localhost:9092 --topic test --from-beginning