什么是消息队列?

消息队列,一般我们简称MQ(也就是Messges Queue的意思)。这个名词也很贴切它的技术实现,实现起来也就是消息+队列。

消息,也就是一般我们业务的数据,理解起来比较简单。

队列,这就涉及到数据结构了。

什么是消息队列?

队列的数据结构想必不陌生了,它具有先进先出的特点。

这样我们对消息队列就有很鲜明的解释了:把消息放到队列里,用队列做存储消息的介质。

那么消息放在队列中总有人需要来存入消息和取消息吧,这时候就引入两个概念:生产者和消费者。

生成者负责投递消息到消息队列中。

消费者负责去消息队列中取消息,也叫消费消息。

什么是消息队列?

 

那么回归到业务中,为什么要使用到消息队列呢?

1、解耦

假设有A、B两个业务接口,A调用B,但是某天B业务接口用不了了,A需要调用其他业务的接口,那么这时A的代码需要做修改,又又过了几天,B接口又可以用了,A又需要调用B的接口或是其他接口都需要A去调用,这时A业务的代码又改改改,A直接爆炸说不干了。。

什么是消息队列?

这时候消息队列就派上用场了,在A业务和其他业务之间引入消息队列,A的调用可以写到消息队列中去,然后其他业务作为消费者去消费消息队列中的消息就可以了。A终于再也不用去改代码了。。这就是解耦的好处。

什么是消息队列?

 

2、异步

异步,在我们日常看来,就是把一件事情分开来处理,分别交给不同的人去做,一起完工。这样的好处很明显可以提高效率和减少处理事情的时间。

在编程的世界里也是一样的!假设有个业务流程是下单成功->短信通知->加用户积分。在没有异步之前,这三个流程是一块走的,也就是一步步往下走,好比如下单100ms,短信通知100ms,用户积分100ms,总共300ms一次请求。

什么是消息队列?

但是引入异步!用消息队列去处理就不一样了。

使用消息队列只需存储下单成功的信息,然后业务处理就变成下单完成后直接请求处理就完了直接耗时100ms,是不是很快?

那么短信通知和加积分的接口就作为消费者去消息队列中取数据完成各自的业务,这样就完成了异步省时的操作!

什么是消息队列?

3、削峰

 消息队列又是如何完成削峰的呢?好比如你现在有两台机器,每台只能处理1000个请求,那预估业务会来3000个请求你怎么办?削峰!把请求的流量高峰削掉,每台机器处理了1000个请求,剩下1000个请求先放到消息队列中,等机器根据自己处理请求的能力去消息队列去拿。

 

最后,本文讲述了消息队列以及消息队列的好处,当然啦,消息队列固然是好,给我们系统架构带来了一定好处,但是也给我们带来了一些问题:

消息数据会丢失吗?

消息如何实现高可用?

消息会不会重复消费?

消息可以保证顺序消费吗?

.......

 

这些都是比较常见的问题,但是针对不同的MQ不同的业务场景都有着不同的解决方案。笔者还会介绍一些相关的MQ组件的内容以及常见问题。