1. Kafka的做用
在大数据系统中,经常会碰到一个问题,整个大数据是由各个子系统组成,数据须要在各个子系统中高性能,低延迟的不停流转。有没有一个系统能够同时搞定在线应用(消息)和离线应用(数据文件,日志)?这就须要kafka。Kafka能够起到两个做用:html
一、下降系统组网复杂度。linux
二、下降编程复杂度,各个子系统不在是相互协商接口,各个子系统相似插口插在插座上,Kafka承担高速数据总线的做用。web
2. Kafka产生背景Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数据。活跃的流式数据在web网站应用中很是常见,这些数据包括网站的pv、用户访问了什么内容,搜索了什么内容等。 这些数据一般以日志的形式记录下来,而后每隔一段时间进行一次统计处理。编程
传统的日志分析系统提供了一种离线处理日志信息的可扩展方案,但若要进行实时处理,一般会有较大延迟。而现有的消(队列)系统可以很好的处理实时或者近似实时的应用,但未处理的数据一般不会写到磁盘上,这对于Hadoop之类(一小时或者一天只处理一部分数据)的离线应用而言,可能存在问题。Kafka正是为了解决以上问题而设计的,它可以很好地离线和在线应用。缓存
3. Kafka架构
生产者(producer):消息和数据产生者架构
代理(Broker):缓存代理负载均衡
消费者(consumer):消息和数据消费者分布式
架构很简单,Producer,consumer实现Kafka注册的接口,数据从producer发送到broker,broker承担一个中间缓存和分发的做用。broker分发注册到系统中的consumer。ide
4. 设计要点一、直接使用linux 文件系统的cache,来高效缓存数据。函数
二、采用linux Zero-Copy提升发送性能。传统的数据发送须要发送4次上下文切换,采用sendfile系统调用以后,数据直接在内核态交换,系统上下文切换减小为2次。根据测试结果,能够提升60%的数据发送性能。Zero-Copy详细的技术细节能够参考:https://www.ibm.com/developerworks/linux/library/j-zerocopy/
三、数据在磁盘上存取代价为O(1)。
a. kafka以topic来进行消息管理,每一个topic包含多个part(ition),每一个part对应一个逻辑log,有多个segment组成。
b. 每一个segment中存储多条消息(见下图),消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到位置的额外映射。
c. 每一个part在内存中对应一个index,记录每一个segment中的第一条消息偏移。
d. 发布者发到某个topic的消息会被均匀的分布到多个part上(随机或根据用户指定的回调函数进行分布),broker收到发布消息往对应part的最后一个segment上添加该消息,当某个segment上的消息条数达到配置值或消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的消息订阅者才能订阅到,segment达到必定的大小后将不会再往该segment写数据,broker会建立新的segment。
四、显式分布式,即全部的producer、broker和consumer都会有多个,均为分布式的。Producer和broker之间没有负载均衡机制。broker和consumer之间利用zookeeper进行负载均衡。全部broker和consumer都会在zookeeper中进行注册,且zookeeper会保存他们的一些元数据信息。若是某个broker和consumer发生了变化,全部其余的broker和consumer都会获得通知。
5. 相似的系统RocketMQ:国内淘宝团队参考开源的实现的消息队列,解决了kafka的一些问题,如优先级问题。
6. 参考资料:http://blog.chinaunix.net/uid-20196318-id-2420884.html
http://dongxicheng.org/search-engine/kafka/