RabbitMQ——消息队列的作用(面试)

消息队列(MQ)

队列(Queue)

是一种“先进先出”数据机构,开发人员最早接触的队列,应该是LinkedList,LinkedList除了是List,也是一个Queue(实际上还是一个stack)。队列的作用,就像生活中买东西,需要排队,先排的人先买消费。

(先后顺序,并不一定是排队的先后,可以由其它权值判断,比如:要求长得高的人先消费。详细可以搜索词条“优先队列”)

消息队列(Message Queue)

简称是MQ,是message queue的缩写,直译就是消息队列(日常沟通可能直接称之为Q)。

Message Queue 在 Queue 的基础功能上,增加了很多新的特性:

1、观察者模式(生产者消费者经典案例,上课老师会教的那个):A负责生产数据,B负责消费数据。利用这个特性,可以实现很多功能,例如:应用解耦,数据总线。

2、异步

3、数据缓存:队列本身属于数据存储结构,对于无法立即处理的消息,可以暂存在队列中,利用这种特征,可以用于实现 “流量消峰填谷”的功能。

 

常见的应用场景

应用解耦、消息分发

(观察者模式的应用)
对于一些大型项目,项目可能由很多个公司共同参与,某些数据一旦产生,可能会有无数个下游系统关注这些数据,主系统不可能给所有的子系统推送消息,子系统应当主动地选择数据进行订阅。
案例:订单数据,商品一旦下单,小程序、报表统计等等,都需要获取这些数据。

数据总线

如果用过EventBus的话,会更容易理解。和第一点的说法非常像,不过是属于更小的应用,就比如微服务,详见spring-boot-starter-amqp。

案例:A同事开发一个项目,B同事开发另一个项目,A和B业务上发生耦合了,使用消息队列的情况下,双方只要协商好数据格式即可,一个人只要负责往队列发送数据,另一个人只要负责消费。

(微服务中有专门的实现工具可以直接使用,本质上看与前一个案例相同。)

流量消峰填谷

(缓存的作用,需要程序员对队列有非常深刻的理解,机器故障时,数据恢复过程是非常棘手的问题)
在短时间内,可能会产生大量的数据,服务器无法及时消化这些数据,这时候,先暂时缓存这些数据,等到服务器资源闲置时,再处理这些数据。

异步

严格上说,这并不算优点,优缺点并存,优点是如果无需关注数据是如何消费的,消息推送之后可以及时释放资源,而缺点,就是处理业务时,需要时刻关注状态的变化。

案例:以文件解压缩为例,A 线程发现文件,将文件信息推送到队列中,等待压缩,B 线程也发现这个文件,并且执行相同的操作,
这时候就容易出现问题,可能会把文件解压 2 次,文件从 “发现” 到 “解压成功” 的时间里,文件处于将要处理而未处理的特殊状态,“异步”需要我们时时刻刻关注这种状态的变化。

 

posted on 2022-03-15 11:02  疯狂的妞妞  阅读(253)  评论(0编辑  收藏  举报

导航