1、基本概念php
Kafka是一种高吞吐量的分布式发布订阅消息系统,它能够处理消费者规模的网站中的全部动做流数据.这种动做(网页浏览,搜索和其余用户的行动)是在现代网络上的许多社会功能的一个关键因素.html
Kafka有以下特性:
kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每一个实例(server)成为broker。不管是kafka集群,仍是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息。java
术语:算法
-
Broker
Kafka集群包含一个或多个服务器,这种服务器被称为broker[5]
-
Topic
每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不一样Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic便可生产或消费数据而没必要关心数据存于何处)。
一个Topic能够认为是一类消息,每一个topic将被分红多个partition(区),每一个partition在存储层面是append log文件。任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset为一个long型数字,它是惟一标记一条消息。kafka并无提供其余额外的索引机制来存储offset,由于在
kafka中几乎不容许对消息进行“随机读写”。
-
Partition Partition是物理上的概念,每一个Topic包含一个或多个Partition.
即便消息被消费,消息仍然不会被当即删除.日志文件将会根据broker中的配置要求,保留必定的时间以后删除;好比log文件保留2天,那么两天后,文件会被清除,不管其中的消息是否被消费.kafka经过这种简单的手段,来释放磁盘空间,以及减小消息消费以后对文件内容改动的磁盘IO开支. partitions的
设计目的有多个.最根本缘由是kafka基于文件存储.经过分区,能够将日志内容分散到多个server上,来避免文件尺寸达到单机磁盘的上限,每一个partiton都会被当前server(kafka实例)保存;能够将一个topic切分多任意多个partitions,来消息保存/消费的效率.此外越多的partitions意味着能够容纳更多的consumer,有效提高并发消费的能力.(具体原理参见下文).
-
Producer
负责发布消息到Kafka broker。
kafka集群几乎不须要维护任何consumer和producer状态信息,这些信息有zookeeper保存;所以producer和consumer的
客户端实现很是轻量级,它们能够随意离开,而不会对集群形成额外的影响. Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪一个partition;好比基于"round-robin"方式或者经过其余的一些算法等.
-
Consumer
消息消费者,向Kafka broker读取消息的客户端。
对于consumer而言,它须要保存消费消息的offset,对于offset的保存和使用,有consumer来控制;当consumer正常消费消息时,offset将会"线性"的向前驱动,即消息将依次顺序被消费.事实上consumer可使用任意顺序消费消息,它只须要将offset重置为任意值..(offset将会保存在zookeeper中,参见下文) 。本质上kafka只支持Topic.
每一个consumer属于一个consumer group;反过来讲,
每一个group中能够有多个consumer.发送到Topic的消息,只
会被订阅此Topic的每一个group中的一个consumer消费(同一个Group的多个consumer不会消费相同的message).
-
Consumer Group
每一个Consumer属于一个特定的Consumer Group(可为每一个Consumer指定group name,若不指定group name则属于默认的group)。
若是全部的consumer都具备相同的group,这种状况和queue模式很像;消息将会在consumers之间负载均衡. 若是全部的consumer都具备不一样的group,那这就是"发布-订阅";消息将会广播给全部的消费者.
一个Topic的多个partitions,被分布在kafka集群中的多个server上;每一个server(kafka实例)负责partitions中消息的读写操做;此外kafka还能够配置partitions须要备份的个数(replicas),每一个partition将会被备份到多台机器上,以提升可用性.Kafka将每一个Topic进行分区Patition,以提升消息的并行处理,同时为保证高可用性,每一个分区都有必定数量的副本 Replica,这样当部分服务器不可用时副本所在服务器就能够接替上来,保证系统可用性服务器
基于replicated方案,那么就意味着须要对多个备份进行调度;每一个partition都有一个server为"leader";leader负责全部的读写操做,若是leader失效,那么将会有其余follower来接管(成为新的leader);follower只是单调的和leader跟进,同步消息便可..因而可知做为leader的server承载了所有的请求压力,所以从集群的总体考虑,有多少个partitions就意味着有多少个"leader",kafka会将"leader"均衡的分散在每一个实例上,来确保总体的性能稳定.网络
在kafka中,一个partition中的消息只会被group中的一个consumer消费;每一个group中consumer消息消费互相独立;咱们能够认为一个group是一个"订阅"者,一个Topic中的每一个partions,只会被一个"订阅者"中的一个consumer消费,不过一个consumer能够消费多个partitions中的消息.kafka只能保证一个partition中的消息被某个consumer消费时,消息是顺序的.事实上,从Topic角度来讲,消息仍不是有序的.数据结构
kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,不然将意味着某些consumer将没法获得消息.
Guarantees
1) 发送到partitions中的消息将会按照它接收的顺序追加到日志中
2) 对于消费者而言,它们消费消息的顺序和日志中消息顺序一致.
3) 若是Topic的"replicationfactor"为N,那么容许N-1个kafka实例失效.
2、使用场景并发
一、Messaging
对于一些常规的消息系统,kafka是个不错的选择;partitons/replication和容错,可使kafka具备良好的扩展性和性能优点.不过到目前为止,咱们应该很清楚认识到,kafka并无提供JMS中的"事务性""消息传输担保(消息确认机制)""消息分组"等企业级特性;kafka只能使用做为"常规"的消息系统,
在必定程度上,还没有确保消息的发送与接收绝对可靠(好比,消息重发,消息发送丢失等)
二、Websit activity tracking
kafka能够做为"网站活性跟踪"的最佳工具;
能够将网页/用户操做等信息发送到kafka中.并实时监控,或者离线统计分析等
三、Log Aggregation
kafka的特性决定它很是适合做为"日志收集中心";application能够将操做日志"批量""异步"的发送到kafka集群中,而不是保存在本地或者DB中;kafka能够批量提交消息/压缩消息等,这对producer端而言,几乎感受不到性能的开支.此时consumer端可使hadoop等其余系统化的存储和分析系统.