消息队列
消息队列(Message Queue),简称MQ,它是在消息的传输过程中保存消息的容器。
消息队列的理解:
消息队列就是一个消息(Message)的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。
对消息队列进一步解读:
消息队列可以简单理解为把要传输的数据放在队列(Queue)中,抛开消息说队列,一种先进先出的数据结构。其中把数据放入消息队列的一方叫生产者,从消息队列中取数据的一方叫消费者。
消息队列的作用:
应用解耦
用户下单
传统处理方法:下单之后,订单系统需要调用支付系统
缺点:假如支付系统无法访问,则支付失败,从而导致下单失败(两个系统紧密的耦合到一起了)
引入消息队列:
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户,下单成功。
支付系统:订阅下单的消息,获取下单信息,进行支付操作。
假如下单时,支付系统不能正常使用,也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作,实现了订单系统和支付系统的应用解耦。
异步处理
用户注册
传统处理方式:注册信息写入数据库成功➡️发送注册邮件➡️发送注册短信➡️返回。
引入消息队列,进行异步处理:
异步处理提高了响应速度,减少了响应所需的时间。
流量削峰
秒杀活动
短时间流量过大,应用会挂掉,为了解决这个问题,一般需要在应用前端加入消息队列,控制活动的人数,可以缓解短时间内高流量压垮应用。
用户的请求,服务器接收之后,首先写入消息队列,加入消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。
消息队列缺点:
系统可用性降低: 系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑消息丢失或者说MQ挂掉等等的情况,但是,引入MQ之后你就需要去考虑了!
系统复杂性提高: 加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题!
一致性问题: 我上面讲了消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度。但是,万一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了!
消息队列中数据的获取:
生产者将数据放到消息队列中,消息队列有数据了,主动叫消费者去拿(俗称push);
消费者不断去轮训消息队列,看看有没有新的数据,如果有就消费(俗称pull);