1. Kafka
首先要先明白kafka是什么要先了解一下中间件的概念。
中间件
中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。目前,它并没有很严格的定义,但是普遍接受IDC的定义:中间件是一种独立的系统软件服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。从这个意义上可以用一个等式来表示中间件:中间件=平台+通信,这也就限定了只有用于分布式系统中才能叫中间件,同时也把它与支撑软件和实用软件区分开来。(摘自百度百科)
对应于Kafka,他作为中间件主要起到的是缓存消息,缓解过载的情况。具体分析看下面图
(图片摘自知乎kafka解决了什么问题?张琪大神的回答)
首先,最简单的信息处理模式就是用户端将消息或者请求发送到应用(这里其实可以是各种应用,可以部署于云端以及其他地方)。然后应用进行信息或者请求的处理,做数据库访问或是其他操作。但是如果数据量变大,用户基数变大,需要的操作几何倍增长,就会出现很多情况,因此上图细化会变成如下
用户将消息或是请求发送到app,所有的访问都直接通过SQL数据库使得它不堪重负,不得不加上缓存服务以降低SQL数据库的荷载;为了理解用户行为,开始收集日志并保存到Hadoop上离线处理,同时把日志放在全文检索系统中以便快速定位问题;由于需要给投资方看业务状况,也需要把数据汇总到数据仓库中以便提供交互式报表。(张琪大佬原话)
看图上其实所有操作都有对应的两两操作,因此复杂度是O(n2)。
而这时候Kafka出马了。Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要用于处理流式数据。他的功能是作为一个缓存式的消息队列。当上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。
同时除了缓存和削峰这个功能,他还有以下的特点:
解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。
冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。
健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进