| 导语 在大家的工作当中,是否碰到大量的插入、更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常”(Too Many Connections)错误,遇到这样的清况?你又是如何处理?
接下来要介绍一下消息队列:
1,什么是消息队列?
2,为什么要用消息队列?
3,消息队列有那些作用?
4,市面上又有那些消息队列可以用?
一、什么是消息队列
“消息队列”(Message Queue,MQ)从字面来理解,是一个队列,拥有先进先出(First Input First Output,FIFO)的特性。它主要用于不同进程或线程之间的通信,用来处理一系列的输入请求。
消息队列采用异步通信机制。即消息的发送者和接收者无须同时与消息队列进行数据交互,消息会一直保存在队列中,直至被接收者读取。每一条消息记录都包含详细的数据说明,包括数据产生的时间、数据类型、特定的输入参数。
二、为什么要用消息队列
当你的客户量一下暴涨时,像前几年大家一起抢购小米手机时,像这种高并发的场景中,由于来不及同步处理请求,接收到的请求往往会发生阻塞。例如:大量的插入、更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常”(Too Many Connections)的错误,相信大家在工作当中都有碰到过。
因此,在这种高并发的应用场景中需要一个缓冲机制,而消息队列则可以很好的充当这样一个角色。消息队列通过异步处理请求来缓解系统的压力。
三、消息队列有那些作用
消息队列除了可以通过异步处理请求来缓解下游系统的压力,还有以下作用:
1、应用解耦
例如:在人脸识别的场景中,客户端拍到用户的照片,并通过网络上传到服务端。
(1)图片上传系统将图片信息(唯一ID、图片类型、图片大小等)批量写入消息队列,写入成功后会将结果直接返回级客户端。
(2)人脸识别系统定时从消息队列中读取数据,完成对新增图片的识别。
图片上传系统无须关心人脸识别系统是否对上传的图片进行了处理,它只需要关心是否成功将图片信息写入消息队列。由于用户也无须立即知晓人脸识别的结果,因此人脸识别系统可选择不同的调度策略来处理消息队列中的图片信息。这样就实现了图 片上传系统与人脸识别系统之间的解耦。
2、异步处理
在之前我们实现用户注册账号时,服务程序需要给用户发送邮件注册信息和短息注册信息。我们常用的做法是:串行方式和并行方式。
(1)串行方式
服务程序先注册信息写入数据库,然后发送短信注册信息,再发送邮件注册信息,三个任务都完成了才会响应用户。如果每个任务需要20s,那一共需要60s。
(2)并行方式
服务程序先注册信息写入数据库,然后同时发送短信注册信息和邮件注册信息,三个任务都完成了才会响应用户。如果每个任务需要20s,那一共需要40s。
采用上面两种方式,当用户量增加时,系统的性能(如并发量、吞吐量、响应时间)分产生瓶颈。此时需要引用消息队列异步处理非必要业务环节。如下图:
(3)异步处理
服务程序先注册信息写入数据库,短信注册信息和邮件注册信息写入消息队列后会直接将结果返回给用户。
由于写入消息队列的速度非常快,基本可以忽略。另外”通过异步读取消息队列中的短信注册信息”过程和发送邮件过程相当于同时进行的,那么整个过程约耗时20s。
异步处理的方式即没有串行和并行可能会遇到的瓶颈,业务处理过程也更快。
3,数据限流
数据限流也是消息队列的常用场景之一,一般在促销和“秒杀”活动中使用得较为广泛。
例如:在电商的“双11”活动中,由于瞬间的数据访问量过大,服务器接收到的数据请求过大,则导致服务器上的应用服务无法处理请求而崩溃。
为了解决这类问题,一般需要先将用户请求写入消息队列(相当于用消息队列做一个缓冲),然后服务器上的应用服务再从消息队列中读取数据。
数据限流具有以下优点:
- 用户请求写数据到消息队列时,不与应用服务直接接触,中间存在一次缓冲。这极大地减少了应用服务处理用户请求的压力。
- 可以设置队列长度,用户请求遵循FIFO(先进先出)的原则。
4,消息通信
消息队列具有高效的通信机制,所以其在点对点通信和聊天室通信中被广泛应用。具体流程如下:
四,市面上又有那些消息队列
各大云厂商的消息队列和开源消息队列:
云厂商 | 开源消息队列 | 硬件消息队列 |
---|---|---|
腾讯云Kafka 腾讯云CMQ 阿里云MQ AWS Kinesis 百度Kafka Ucloud UKafka等 | Apache Kafka RabbitMQ RocketMQ ActiveMQ ZeroMQ等 | Solace等 |
下一章将对比RabbitMQ、RocketMQ、CMQ、kafka和Ckafka(二)