消息队列MQ

MQ的相关概念

1. 什么是MQ

Message Queue,从字面上来讲就是一个队列。既然是队列,就一定遵循队列先进先出的特性

  • 队列中存放的是一条条消息
  • 消息队列可以实现跨进程通信
  • 用于上下游传递消息

    2. 为什么要使用MQ

  • 流量削峰

    假设商城系统最多能够同时处理一万次订单请求。 一般来说,应付正常的订单请求是绰绰有余的 但是在使用量高峰期,如果同时有两万次订单请求,那么系统是无法同时处理这么多的 但是我们又不想放弃这么多的订单 就可以让消息队列帮我们起到缓冲的作用,将超出的订单请求存入消息队列中 消息队列可以保证在后续的一段时间内,这些请求可以全部被执行完 最后的结果就是,某些用户可能在确认下单后的十几秒后才能收到下单成功的通知

  • 应用解耦

    在电商应用中,假设我们现在有订单系统、库存系统、物流系统和支付系统 用户创建订单之后,需要耦合库存系统、物流系统和支付系统 如果其中的任何一个系统出现了故障,就可能导致用户下单的失败 但是假设物流系统因为故障而需要几分钟来修复 那么可以将物流系统要处理的信息缓存到消息队列中,从而保证用户在这段时间内可以正常下单 并且当物流系统恢复正常之后,可以保证订单信息全部被处理完

image.png

  • 异步处理

    在微服务中,服务之间进行调用是十分常见的 比如我们现在有服务A需要调用服务B,但是服务B需要很长的一段时间进行处理,并且服务A需要知道服务B什么时候可以处理完,目前有如下两种方式来进行解决:

    1. 轮询:服务A隔一段时间就去调用服务B相关的api进行查询
    2. 回调:服务A提供一个回调api,当服务B执行完毕后调用此接口通知服务A

    但除了这两种方式外,我们使用消息队列可以很好地处理这个问题 服务A在调用服务B之后,服务B执行完毕后发送消息给MQ,然后MQ再将消息转发给服务A,从而告知服务A异步处理成功的消息

image.png

3. MQ的分类

image.png
image.png
image.png
image.png

4. MQ的选择

image.png

相关协议

【技术选型】AMQP vs MQTT