什么是kafka?
kafka是一个分布式流式平台,可以经过订阅-发布模式在应用之间实时传递数据流,同时保证可靠性和容错性;简单理解,就是一个分布式消息队列。html
kafka涉及的3基本概念
- kafka服务:既能够以单点方式运行,也能够经过多个节点组成集群运行;
- record:kafka中的每条记录称为一个record,由key、value、timestamp 3个部分组成;
- topic:消息能够分类,每一个类别称做一个topic;
kafka包含4个核心的API:

- Producer:发布消息到一个或者多个topic;
- Consumer:从一个或者多个topic中订阅而且处理消息;
- Stream:将应用程序做为一个流式处理器,从topic中订阅消息、并进行处理,而后再发布到其它topic中;
- Connector:能够帮助创建一个能够重用的Producer或者Consumer,好比:经过基于关系型数据库的connector能够在数据表中保存每次变动;
对topic和partition的理解

- topic能够看作是对一系列消息的分类,producer会将相同类别的消息发送到同一个topic。一个topic能够被0个或者多个consumer订阅。
- 在kafka集群内部,一个topic的数据会存放到多个分区日志中,每一个分区称为一个partition;
- 在一个partition中,消息序列是有序的(按照写入的时间顺序)、而且不可变的(消息提交,不可改变);partition中会为每条消息分配一个惟一的id,称做offset,用来惟一标识分区中的一条消息记录;
topic中消息的顺序并不是全局有序,只是局部有序;
单看每一个partition中的消息都是按照写入顺序排列的,可是从topic的视角来看,因为是并发处理多个partition中的消息,于是整个处理过程并不是是有序的;数据库
- kafka集群会保存全部已经发布的消息,不管消息是否被消费;能够配置保留消息的时长;kafka中性能随着数据量的增长是常数级降低,于是保留较长时间段的消息并非问题;
- consumer处理消息的标识,由consumer本身维护,每一个consumer中须要保留offset元数据,用于标识当前读取消息在日志中的位置;
消息读取进度由每一个consumer经过改变offset自行控制;
consumer便可以按照顺序读取每一条消息,也能够改变offset到以前的位置,重复读取旧的消息;或者改变offset到以后的位置,用来跳过一部分消息;这种设计使得consumer的接入和断开变得很是容易,不会影响到集群中的其它consumer;并发
- partition的设计主要包含2个目的:扩容和并发。首先,一个topic能够包含多个partition,多个partition能够分布在多个机器上,于是能够处理大规模的数据;同时,多个partition能够同时被多个consumer消费,于是提升了并发性;
分布式概念的理解
- 节点:一个kafka集群中的一个进程。一个topic的partition能够分布在集群中的多个节点;每一个partition能够经过配置指定副本数量,每一个副本(replication)存放在不一样的节点上,以此进行容错;
- partition:每一个partition的副本包含一个leader、0个或者多个follower。leader负责处理当前partition数据的全部读写请求,同时全部follower复制同步leader的数据;当leader节点宕掉后,follower中的一个会自动变为新的leader;集群中的每一个节点均可以看作是一部分partition的leader,同时又能够看作是其它partition的follower,于是保证了集群的负载均衡;
- producer:用于发布消息到多个topic的一组进程。能够选择消息发布在topic的那个partition上。便可以以轮询的方式将消息轮流放到每一个partition上,以保证负载均衡。也能够经过定制分区策略来保证消息落到特定的分区;
- consumer:用于处理消息的一组进程或者多组进程。每组进程划分为一个group,对于同一个topic的一个group内,一条消息只会被一个consumer消费。一个group中的一个consumer负责消费一个topic中的一个或者多个partition,不一样的consumer消费的partition不重合。该设计能够保证同一个group内消息的负载均衡,又能够保证消息不被同时消费。consumer和partition经过kafka协议动态维护,当新加入一个consumer,将会把其他consumer负责消费的partition分配给该consumer;相反,当有consumer宕机后,其负责的partition将会被分配给剩余的consumer。一个group中的consumer数量不该该比partition的数量多。

partition+group 保证按顺序读取消息负载均衡
在一个group中,一个partition只会绑定给一个consumer进程消费,且一个partition中的消息是局部有序的。若是咱们须要保障某一批消息按顺序执行,只要保障其可以落入同一个partition中便可(消息设置相同的key)。若是须要保证消息的全局顺序,则可使topic仅包含一个partition,从而仅有一个consumer进行消费;分布式
kafka的应用场景
- 消息队列
kafka用做message broker(消息代理),适用于高吞吐、内建分区、可复制、可容错的消息队列。
- 网站活动追踪
经过一系列实时的订阅-发布数据流,重建用户活动轨迹。将网站活动(PV,搜索等动做)发布到kafka的topic中,供下游实时处理,监控或者加载到线下数据仓库作离线计算和报表。
- 运行数据统计
用于监控运行数据,汇聚以后进行统计。
- 日志聚合
用于替代Flume、Scribe的等日志收集工具,提供高性能、持久性、低延迟的日志收集。
- 流式处理
用做流式处理工具,进行数据的聚合、富集、转换等操做。相似与Apache Storm等工具。
- 事件源模式实现
用于实现Event Sourcing Pattern
阅读原文http://click.aliyun.com/m/40005/工具