一、为什么我要写Kafka?
a、我认为kafka在项目中很实用,比如当你负责的项目的业务量,数据量达到一定程度的时候,当想做一个xxx分析日志系统的时候,用kafka+ELK是再好不过的一种方案了。
b、我们公司项目中有用到Kafka,rocketmq,虽然我负责的模块暂时没有涉及到。后续肯定会涉及到的,到时分享如何在我的项目中应用的以及线上发生的问题和如何解决的。
二、消息队列
a、什么是消息队列
1、从字面来理解,是一个队列,先进先出的特性。可以用于不同进程和线程之间的通信,用来处理一系列的输入请求。
2、采用异步通信的机制,消息的发送者和接收者无须同时与消息队列进行数据交互。消息会一直保存在队列中,直至被接受者读取。
3、每一条消息记录都包含详细的数据说明,数据产生的时间,数据类型,特定的输入参数等等。
b、缓冲机制
因为在高并发的场景之下,由于来不及同步处理请求,接收到的请求往往会发生阻塞,由于大量的请求同同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常”。
但是引入消息队列之后,消息队列可以通过异步处理请求来缓解系统的压力。
c、消息队列有哪些主要的作用
1、应用解耦
多个应用可以通过消息队列对相同的消息进行处理,应用之间相互独立,互不影响。
1)、消息队列允许应用接口独立地进行扩展,只要应用接口遵守同样的接口约束,并且消息与平台和语言无关,并且在语法上也不再是函数之间的调用
举例子:我们都见过人脸识别的系统,流程如下:
(1)、图片上传系统将图片的信息(如唯一ID,图片类型,图片尺寸等)批量写入消息队列,写入成功之后会将结果直接返回给客户端。
(2)、人脸识别系统会定时从消息队列中读取数据,完成对新增图片的识别。
在上面的流程中,图片上传系统无须关心人脸识别系统是否对上传图片进行了处理,它只需要关心是否成功将图片信息写入消息队列。
由于用户无须立即知晓人脸识别的结果,因此人脸识别系统可选择不同的调度策略来处理消息队列中的图片消息。
2、异步处理
相比于串行和并行处理,异步处理可以减少处理的时间
1)、举个例子,在我们注册账号的时候,服务程序需要给用户发送邮件注册信息和短信注册信息,比较传统的做法:串行和并行的方式
串行的流程如下:
串行:先将用户注册信息写入数据库,然后发送短信注册信息,再发送邮件注册信息,以上三个任务都完成,在将结果返回给用户。
假设三个阶段的耗时平均为20ms,不考虑网络等其他的消耗,则整个过程需要消耗60ms。
并行的流程如下图:
并行:先将用户注册信息写入数据库,然后发送短信注册信息的同时还发送邮件注册信息,以上任务全部完成之后才会将结果返回给用户。假设这三个阶段耗时平均20ms,不考虑网络等其他耗时,则整个过程需要耗时40ms。
但是并行的方式提高了处理效率,减少了处理时间。
异步处理的方式如下图:
针对串行和并行的缺点-系统的性能会产生瓶颈,此时需要引入消息队列处理非必要业务环节。
比如:用户将注册信息写入数据库约耗时20ms,短信和邮件注册信息写入消息队列后会直接将结果返回给用户,由于写入消息队列的速度非常快,基本可以忽略。
所以整个过程消耗20ms。
3、数据限流
在流量高峰期,可以通过消息队列来控制流量,避免流量过大而引起应用系统崩溃。
1)、数据限流是消息队列的常用的场景之一,一般用在促销和秒杀的场景。由于瞬间的数据访问量过大,服务器接受到的数据请求过大,则导致服务器上的应用服务无法处理请求而崩溃。所以引入消息队列做一次缓冲,然后服务器上的服务再从消息队列中读取数据。
2)、减少了应用服务处理用户请求的压力。
3)、可以设置队列的长度,用户请求遵循FIFO原则,请求处于队列之外的,是无法秒杀到商品的。这些请求将会直接被抛弃,返回给用户“商品已售完”的结果。
4、消息通信
实现点对点消息队列或聊天室等。
消息队列具有高效的通信机制,所以在点对点通信和聊天室通信被广泛使用。
好吧~~今天到这了,明天见。