背景:算法
当今社会各类应用系统诸如商业、社交、搜索、浏览等像信息工厂同样不断的生产出各类信息,在大数据时代,咱们面临以下几个挑战:服务器
以上几个挑战造成了一个业务需求模型,即生产者生产(produce)各类信息,消费者消费(consume)(处理分析)这些信息,而在生产者与消费者之间,须要一个沟通二者的桥梁-消息系统。网络
从一个微观层面来讲,这种需求也可理解为不一样的系统之间如何传递消息。并发
Kafka诞生:由 linked-in 开源框架
kafka-便是解决这类问题的一个框架,它实现了生产者和消费者之间的无缝链接。分布式
kafka-高产出的分布式消息系统(A high-throughput distributed messaging system)高并发
Kafka特性:它形容本身的设计是独一无二的,先看一下它有如何过人之处:大数据
Kafka的组件:ui
以下图所示,Producer生产的消息经过网络发送给Kafka cluster,而Consumer从其中消费消息.net
Topic 和Partition:
消息发送时都被发送到一个topic,其本质就是一个目录,而topic由是由一些Partition Logs(分区日志)组成,其组织结构以下图所示:
咱们能够看到,每一个Partition中的消息都是有序的,生产的消息被不断追加到Partition log上,其中的每个消息都被赋予了一个惟一的offset值。
Kafka集群会保存全部的消息,无论消息有没有被消费;咱们能够设定消息的过时时间,只有过时的数据才会被自动清除以释放磁盘空间。好比咱们设置消息过时时间为2天,那么这2天内的全部消息都会被保存到集群中,数据只有超过了两天才会被清除。
Kafka须要维持的元数据只有一个--消费消息在Partition中的offset值,Consumer每消费一个消息,offset就会加1。其实消息的状态彻底是由Consumer控制的,Consumer能够跟踪和重设这个offset值,这样的话Consumer就能够读取任意位置的消息。
把消息日志以Partition的形式存放有多重考虑,第一,方便在集群中扩展,每一个Partition能够经过调整以适应它所在的机器,而一个topic又能够有多个Partition组成,所以整个集群就能够适应任意大小的数据了;第二就是能够提升并发,由于能够以Partition为单位读写了。
分布式:
这些Partitions分布在集群的每一台server上,而每个Partition在集群中均可以有多个备份,这个备份数量是可配置的。
每一个Partition都有一个leader server,而其余备份的server都称为followers,只有leader服务器才会处理这个Partition上全部的读写请求,而其它followers则被动的复制leader上的数据。若是一个leader挂掉了,followers中的一个服务器则会自动升级为leader。所以,其实集群中的每一个服务器都扮演着一个Partition的leader服务器,和其它Partition的follower服务器。
Producers:
Producer能够根据本身的选择发布消息到一个主题,Producer也能够本身决定把消息发布到这个主题的哪一个Partition,固然咱们能够选择API提供的简单的分区选择算法,也能够本身去实现一个分区选择算法。
Consumers:
消息传递一般由两种模式,queuing(队列)和publish-subscribe (发布-订阅)
Kafka经过提供了一个对Consumer的抽象来同时实现这两种模式-ConsumerGroup。Consumer实例须要给本身指定一个ConsumerGroup的名字,若是全部的实例都用同一个ConsumerGroup名字,那么这些Consumer就会以queuing的模式工做;若是全部的实例分别用的不一样的ConsumerGroup名字,那么它们就以public-subscribe模式工做。
以下图所示:含两台server的集群一共有p0~p3四个Partition,两个Consumer Group,在Group内部是以queuing的模式消费Partition,在Group之间是以pub-scrib模式消费。
消息顺序性:
Kafka是如何确保消息消费的顺序性的呢?前面讲到过Partition,消息在一个Partition中的顺序是有序的,可是Kafka只保证消息在一个Partition中有序,若是要想使整个topic中的消息有序,那么一个topic仅设置一个Partition便可。
想更深刻的了解Kafka请参阅个人另外一篇文章:《Kafka设计与原理详解》