ApacheKafka简介2提纲简介基本拓扑主题和日志分布生产者、消费者保证用例3简介Kafka是一种分布式的、分区的、复制分发的提交日志服务。它以一种独特的设计提供消息系统的功能。名词定义:Kafka使用“主题”(topics)来维护不同的消息分组向主题发布消息的进程被称为“生产者”(producers)订阅主题、处理被发布的消息的进程被称为“消费者”(consumers)Kafka运行在由一个或多个服务器组成的集群上,每个服务器被称为一个“调度者”(broker)4基本拓扑简单的说,生产者通过网络向Kafka集群发送消息,而后这些消息被提供给消费者使用,如下图:客户端和服务器之间的通信使用的是一种简单、高性能、语言无关的TCP协议。Kafka开发团队提供了Java客户端,但其他各种语言的客户端也很多。5主题(Topics)和日志(Logs)主题是Kafka消息发布的所在。Kafka为每个主题维护一个分区的日志结构,如图。每个分区(partition)是一个提交日志。消息严格按照提交顺序被添加到分区中。该消息序列是不可修改的(只有写入,不存在修改、删除)。每条消息都会被分配给一个在本分区内唯一的序号。这个序号被称为“偏移量”(offset)。6主题(Topics)和日志(Logs),续1在配置允许的时间段内,Kafka集群保留所有被发布的消息,不论这些消息是否已经被消费过。例如,如果日志存留期(logretention)被设置为2天,则一个消息在它被发布后的2天内都是可供反复消费的,2天后它会被丢弃以释放空间。从数据尺寸方面讲,Kafka的性能是一个常量,所以不论存储多少消息都不是问题。Kafka在每消费者级别上保存的元数据仅为消费者在日志中的offset,其值由消费者控制。一般消费者是沿着offset线性增长方向来消费消息,但它完全可以按照任意顺序访问任意offset。因此消费者可以任意加入和离开,对集群和集群上的其他消费者几乎不会有什么影响。7主题(Topics)和日志(Logs),续2Kafka主题日志分区的目的:允许数据任意增长,无视单一服务器处理能力的限制。每个单独的分区必须能够被负责它的服务器所容纳,但一个主题可以有任意多的分区,因此主题可以容纳任意量的数据。实现并发性。后面我们展开论述并发性。8分布分区的日志被分发到集群内的服务器上,每台服务器负责处理一些分区和对这些分区的读写请求。为满足容错需求,各分区的数据都按一个可配置的量被复制到集群的其他服务器上。每个分区都有一个“领导”(leader)服务器和0到多个“追随者”(follower)服务器。领导服务器负责对这个分区的所有读写操作,而追随者服务器则被动的复制领导服务器。如果领导服务器宕机,其中一台追随者服务器会自动被选举为新领导。一个分区的领导服务器可能是另外几个分区的追随者服务器,所以总体上集群的负载是均衡的。9生产者生产者(producer)向主题(topic)发布消息。生产者自身要负责决定把消息发布到主题中具体哪个分区(partition)。分区选择可以是简单的轮盘式(round-robin),也可以是基于某种语义分区功能(如根据消息中的某键值来运算目标分区编号)。10消费者传统的消息系统有队列(queuing)和发布-订阅(publish-subscribe)两种模型。在队列模型中,一群消费者从一个队列中读取消息,每一消息仅被某一个消费者获取。在发布-订阅模型中,同一消息被广播到所有消费者。Kafka使用”消费组”(ConsumerGroup)来同时提供对二者的抽象。同一个消费组中的消费者有相同的消费组名称。这些消费者可以是不同的进程,甚至是在不同的机器上。发布到主题中的一条消息,会被订阅这个主题的消费者组中的某一个消费者收到。在这种模型下,如果有所消费者都属于同一组,就相当于队列模型;如果消费者的组名各不相同,就相当于发布-订阅。11消费者,续1通常情况下,每个主题会有少量的消费组。为了达成可缩放性和容错性,每个消费组又由多个消费者构成。从语义上讲这属于发布-订阅模型,只不过订阅者不是一个单一的进程,而是消费者的集群。下图表示一个双节点Kafka集群,其上的主题有4个分区P0–P3。两个消费组A和B各有2个(C1,C2)和4个(C3-C6)消费者成员。12消费者,续2传统的消息队列服务器按接收顺序存储消息,并按同样的顺序向消费者分发数据,但由于分发过程是异步的,消息抵达不同的消费者的时间不可控,当多个消费者进行并行处理时就失去了消息的顺序性。如果只允许一个消费者消费,可以保证顺序性,但又失去了并发性。Kafka更好地平衡了消息处理的有序性和并发性。在一个特定消费组内,Kafka保证每个分区被且仅被分配到一个消费者实例上。如此可以保证该消费者是该分区的唯一读者且总是严格按照顺序收到消息;而用多分区服务同组多个消费者又提供了并发处理能力。注意:该模式决定每个消费组中的有效消费者数量一定小于或等于主题包含的分区数量。13消费者,续3请注意Kafka仅在同一分区内保证的消息顺序性,而不保证跨分区的消息顺序性。对大多数应用来说,分区内消息顺序性加上按消息键值分区的能力足以满足总体顺序性需求。如果确实需要严格的总体顺序性,则主题只能包含一个分区,而这意味着每个消费组只有一个消费者进程能读取消息。14保证在较高层面,Kafka提供如下保证:一个生产者发布到某一特定主题分区的消息一定会按照消息发送的顺序写入。例如,如果生产者P1先发送消息M1再发送消息M2,则M1的偏移量会低于M2(即M1在log中出现早于M2)。一个消费者观察到的消息的顺序,与消息在log中存储的顺序一致。如果一个主题的复制因子为N,则Kafka可以容忍最大N-1的服务器宕机而不损失任何提交到log的消息。15用例Kafka可以被应用于以下场景:消息系统:可与ActiveMQ或RabbitMQ相比网站活动追踪:记录页面查看、搜索等用户行为,并使用这些数据进行实时监视、分析指标收集:如从多个源收集系统运行状态监视数据日志汇总:取代传统的以文件形式实现的中央日志存储方案流数据处理:结合Storm等实时计算框架进行流数据处理事件溯源:利用Kafka消息顺序性实现事件溯源提交日志:可以ApacheBookKeeper相比谢谢大家!