MQ简介

MQ是什么

在计算机科学中,消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的队列用来处理一系列的输入,通常是来自用户。 消息队列提供了异步的通信协议,每一个队列中的纪录包含详细说明的资料,包含发生的时间,输入设备的种类,以及特定的输入参数。

这意味着:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。 实际上,消息队列常常保存在链表结构中。[2]拥有权限的进程可以向消息队列中写入或读取消息。


为什么要使用MQ

  1. 大幅度提高响应速度。
    以注册为例,注册成功(数据写入数据库)后,需要发送注册邮件、短信,如果是传统项目,同步进行响应速度较慢。
    而如果使用MQ,就可以将发送邮件、短信的信息写入MQ中,然后先直接给用户响应。
  2. 不同服务之间解耦。
    模拟面试服务直接调用消息提醒服务的接口,耦合性较高。
    MQ可以让mock interview service将需要调用的信息写入MQ中,message remind service通过订阅MQ来实现解耦。
  3. 削峰。
    用户请求并发量高时,可以将请求先写入MQ,然后慢慢处理。

MQ的缺点

消息队列本身是异步的,它允许接收者在消息发送很长时间后再取回消息,这和大多数通信协议是不同的。
例如WWW中使用的HTTP协议(HTTP/2之前)是同步的,因为客户端在发出请求后必须等待服务器回应。然而,很多情况下我们需要异步的通信协议。比如,一个进程通知另一个进程发生了一个事件,但不需要等待回应。
但消息队列的异步特点,也造成了一个缺点,就是接收者必须轮询消息队列,才能收到最近的消息。


MQ中的核心概念

消息代理

消息代理(message broker)就是消息服务器,消息发送者是将消息发送给消息代理。

目的地

消息代理收到消息之后,需要将该消息发送给指定的目的地(destination)。
目的地主要有两种形式:

  1. 队列(queue)
    消息代理将消息发送到一个队列中,消息接收者从队列中获取消息,消息读取后被移除队列。这种方式也叫点对点式,即只有一个发送者对应一个接收者。
  2. 主题(topic)
    消息代理将消息发布到主题,多个接收者监听这个主题,在消息到达时同时收到消息。

JMS与AMQP规范

JMS与AMQP概念

JMS(Java Message Service)是指Java消息服务,它是基于JVM消息代理的规范,而ActiveMQ是JMS规范的实现。

AMQP(Advanced Message Queue Protocol)是指高级消息队列协议,它也是消息代理的规范,RabbitMQ是它的实现。

JMS与AMQP比较

  1. JMS是基于JVM的规范,因此它的实现无法跨语言;而AMQP是一种更高级的规范,因此其实现可以跨语言。
  2. JMS支持两种消息模型,分别是点对点订阅/发布,分别对应队列和主题的目的地形式;而AMQP支持五种消息模型。
  3. JMS支持多种消息类型(TextMessage、MapMessage、ObjectMessage、ByteMessage)等;而AMQP只支持byte[]类型。

SpringBoot的支持

  1. spring-jms提供了对JMS规范的支持,提供JmsTemplate发送消息。
  2. spring-rabbit提供了对AMQP的支持,提供RabbitTemplate发送消息。
  3. 分别使用@EnableJms@EnableRabbit开启支持。
  4. JmsAutoConfigurationRabbitAutoConfiguration分别是Jms、AMQP的自动配置类。