引言
如果你想了解消息队列,那么欢迎你读下去
消息队列一词相比各位都多有耳闻,就算你没有用过你也知道 队列 吧。
考试时,面试时都经常会被问到 队列和栈有什么区别? 99%的同学都能答出来栈是先进后出,而队列是先进先出。
那消息队列是什么呢?他又有什么作用?
🍬糖果厂老板的例子
来,让我们从一个家具厂的例子来了解消息队列
话说方老板开了一家糖果厂,为了方便管理,他将厂分为两个车间:加工车间和包装车间
加工车间主要负责将加工制作成散装糖果
包装车间主要负责将糖果称重检查并包装
一般来说,加工车间的工人会将加工好的糖果运送到包装车间
但一来二去方老板发现,加工车间的工人在运输糖果🍬去包装车间的时候
就不得不停下手中的活,将糖果送过去再回来继续加工
这大大降低了生产的效率
怎么办呢?
方老板在两个车间之间装了一条传送带,加工车间只需要将加工完的糖果放到传送带上
就可以接着去加工了,包装车间直接从传送带上去取糖果。这样大大提升了效率
但是不久又出现了新的问题:
加工车间动作太快了,包装车间上一批还没包装完,这一批就已经到了
怎么办呢?
方老板在包装车间旁开出开一块糖果冷藏室,用来保存加工车间加工完的糖果
包装车间只需要从冷藏室取糖果就好
方老板不知不觉完成了一个消息队列
为解决效率问题: 他在两个车间(程序)间加了传送带
为解决加工包装不一致的问题: 他在两个车间(程序)间加了存储仓库
在上面的模型中,加工车间就是消息生产者,生产未进行包装的糖果
包装车间就是消息消费者,消费冷藏室里的未包装糖果
而 履带和冷藏室 共同组成了消息队列
通过糖果厂的例子不难得出结论:
消息队列 解决了应用间的通信问题,有传送带般收发消息的作用
消息队列 存储消息,如上述例子的贮藏室
消息队列的作用
1、异步
借用方老板的例子,通俗来说,异步就是:
加工车间的工人不必亲手将糖果🍬交到包装车间工人的手上
只需要把未包装的糖果放上传送带,就接着去加工糖果了
第一次用消息队列是在自己的一个秒杀项目上
为什么要用到消息队列呢?这里的消息队列就起着一个异步的作用
提升用户体验,更快的返回结果
2、削峰
还是自己之前的秒杀项目
为了避免大量的秒杀请求压垮服务器,当网关层接收到秒杀请求之后将请求发送至消息队列,后台真正处理秒杀的服务依据自身能力从消息队列取消息消费
3、服务间解耦
不难看出,消息队列具有通信的功能,其也有服务间解耦的能力,上面连个例子,基本都能看做是两个服务,通过消息队列通信解耦开来
4、微服务的发布和订阅、广播等
对于下游的消费者来说,其消费消息队列的消息,就像观察者模式中的观察者一样
反之,向队列中生产数据的消息生产者,等同于观察者模式中的被观察者
与java简单的直接用接口进行观察者和被观察者"通信"不同的是:
其是通过消息队列来”通信“的,生产者发布,消费者订阅
既然可以1对1,那消息队列也就可以支持1对多的广播形式
以上就是一个简单的通过消息队列进行的广播
总结
消息队列的作用
- 异步化
- 解耦
- 削峰、流量控制
- 发布订阅,广播、服务间通信等
消息队列的不足
- 强制异步
- 消息延迟
- 复杂
- 可能出现丢消息的问题,造成数据不一致
今天分享了自己对消息队列的所学,带小白了解了一下消息队列,后面会陆陆续续增加关于消息队列的分享,以上所写,若有问题欢迎交流指正【抱拳】
来源:CSDN
作者:funyoo
链接:https://blog.csdn.net/weixin_41978722/article/details/103977596