什么是消息队列
消息队列,MQ(Message Queue),包含两个关键词:消息和队列
1、消息是指在应用间传输的数据,消息表现形式是多样的(包括文本、结构化的对象格式等)。
2、队列,抽象意义上来说,就是消息的进和出,从时间意义上来说进和出不一定是同步的,一个典型的消息队列,至少包含消息的发送、接受和存储功能。
消息队列是一种先进先出的数据结构,是一种应用程序对应用程序的通信方式。生产着消费者模型的一个典型代表。
消息队列的作用
主要围绕三点:应用解耦、异步消息、流量削峰
**解耦:**系统的耦合性越高,容错性越低。
应用场景:订单系统
传统做法:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201229160513428.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjk5NzY5OA==,size_16,color_FFFFFF,t_70#pic_center)
传统模式的缺点:
用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出现故障或者升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验;系统的耦合度越高,容错性越低。
中间件模式:
使用消息队列解耦合,系统的容错性就高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统恢复上线后,补充处理存在消息队列中的数据即可,终端系统感知不到物流
系统发生过几分钟的故障。
异步:
场景说明:用户注册后,需要发注册邮件和注册短信
传统的做法有两种方式:
1、串行:将注册信息写入数据库成功后,发送注册邮件,再发送短信;
2、并行:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信
使用消息队列:将不是必须的业务逻辑,异步处理。改在后如下:
削峰:
场景说明:商品秒杀业务,一般会因为流量过大,导致流量暴增,应用挂掉传统做法
限制用户数量
使用消息队列
用户的请求,服务器接收后,首先写入消息队列,秒杀业务
增加一个消息队列,不管请求有多少,先存入消息队列,让系统慢慢处理请求,假如消息队列长度超过最大数量,则直接抛弃用户请求或者跳转到错误页面。
消息队列缺点
1、系统可用性降低。
系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了, ABCD 四个系统好好的,没啥问题。但是你偏偏要在系统A和BCD之间加个MQ,好了,MQ一挂,整套系统就蹦,A就调不到BCD了。
2、增加了系统的复杂度。
硬生生加个MQ进来,怎么保证消息没有重复消费?消息丢失的情况?消息的传输顺序性?问题一大堆,都得一一的去处理。
消息队列