MQ简介
MQ是什么
在计算机科学中,消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的队列用来处理一系列的输入,通常是来自用户。
消息队列提供了异步的通信协议,每一个队列中的纪录包含详细说明的资料,包含发生的时间,输入设备的种类,以及特定的输入参数。
这意味着:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。
实际上,消息队列常常保存在链表结构中。[2]拥有权限的进程可以向消息队列中写入或读取消息。
为什么要使用MQ
- 大幅度提高响应速度。
以注册为例,注册成功(数据写入数据库)后,需要发送注册邮件、短信,如果是传统项目,同步进行响应速度较慢。
而如果使用MQ,就可以将发送邮件、短信的信息写入MQ中,然后先直接给用户响应。 - 不同服务之间解耦。
模拟面试服务直接调用消息提醒服务的接口,耦合性较高。
MQ可以让mock interview service将需要调用的信息写入MQ中,message remind service通过订阅MQ来实现解耦。 - 削峰。
用户请求并发量高时,可以将请求先写入MQ,然后慢慢处理。
MQ的缺点
消息队列本身是异步的,它允许接收者在消息发送很长时间后再取回消息,这和大多数通信协议是不同的。
例如WWW中使用的HTTP协议(HTTP/2之前)是同步的,因为客户端在发出请求后必须等待服务器回应。然而,很多情况下我们需要异步的通信协议。比如,一个进程通知另一个进程发生了一个事件,但不需要等待回应。
但消息队列的异步特点,也造成了一个缺点,就是接收者必须轮询消息队列,才能收到最近的消息。
MQ中的核心概念
消息代理
消息代理(message broker)就是消息服务器,消息发送者是将消息发送给消息代理。
目的地
消息代理收到消息之后,需要将该消息发送给指定的目的地(destination)。
目的地主要有两种形式:
-
队列(queue)
消息代理将消息发送到一个队列中,消息接收者从队列中获取消息,消息读取后被移除队列。这种方式也叫点对点式,即只有一个发送者对应一个接收者。 -
主题(topic)
消息代理将消息发布到主题,多个接收者监听这个主题,在消息到达时同时收到消息。
JMS与AMQP规范
JMS与AMQP概念
JMS(Java Message Service)是指Java消息服务,它是基于JVM消息代理的规范,而ActiveMQ是JMS规范的实现。
AMQP(Advanced Message Queue Protocol)是指高级消息队列协议,它也是消息代理的规范,RabbitMQ是它的实现。
JMS与AMQP比较
- JMS是基于JVM的规范,因此它的实现无法跨语言;而AMQP是一种更高级的规范,因此其实现可以跨语言。
- JMS支持两种消息模型,分别是点对点和订阅/发布,分别对应队列和主题的目的地形式;而AMQP支持五种消息模型。
- JMS支持多种消息类型(TextMessage、MapMessage、ObjectMessage、ByteMessage)等;而AMQP只支持byte[]类型。
SpringBoot的支持
- spring-jms提供了对JMS规范的支持,提供
JmsTemplate
发送消息。 - spring-rabbit提供了对AMQP的支持,提供
RabbitTemplate
发送消息。 - 分别使用
@EnableJms
、@EnableRabbit
开启支持。 JmsAutoConfiguration
、RabbitAutoConfiguration
分别是Jms、AMQP的自动配置类。