1.1 消息队列MQ
MQ 全称为Message Queue,消息队列是应用程序与应用程序之间的通信方式。
- 为什么使用MQ
在项目中,可以将一些无需及时返回且消耗时间的业务模块提取出来,进行异步处理。异步处理的方式可以大大节省服务器的请求/响应时间,进而达到提高系统吞吐量的目的。
- MQ使用场景
1、任务异步处理
将不需要同步处理并且耗时较长的操作由消息队列通知消息接收方进行异步处理。提高应用服务响应时间。
2、应用程序解耦
MQ相当于一个中介,生产者通过MQ与消费者进行数据交换,将应用程序之间的关系进行了解耦。生产者与消费者在代码层面不再强耦合。
服务A请求服务B,服务B返回响应信息
服务A将消息发布至MQ即可得到成功响应,服务B异步消费
1.2 MQ两种实现方式
MQ是消息通信的模型;实现MQ的大致有两种主流方式:AMQP,JMS.
1.2.1 AMQP
AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。这也是和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换数据格式。
1.2.2 JMS
JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个程序直接,或分布式系统中发送消息,进行异步通信。
1.2.3 AMQP 与JMS 区别
- JMS 是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互格式。
- JMS 限定了必须使用Java语言,AMQP只是协议,不规定实现方式,因此是跨语言的。
- JMS 规定了两种消息模式(同步/异步);而AMQP的消息模式更加丰富。
1.3 消息队列相关产品
市场上常见的消息队列如下:
- ActiveMQ:基于JMS
- ZeroMQ:基于C语言开发,小巧
- RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好
- RocketMQ:基于JMS,阿里巴巴产品
- Kafka:一款类似MQ的产品;分布式消息系统,高吞吐量
1.4 RabbitMQ简介
RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列)协议实现的消息队列,它是一种应用程序直接的通信方法,在分布式系统中应用广泛。
RabbitMQ官方地址:https://www.rabbitmq.com/
RabbitMQ提供了6种模式:简单模式,work模式,Publish/Subscribe发布与订阅模式,Routing路由模式,Topics主题模式,RPC远程调用模式(远程服务调用不属于MQ)。
官网对应模式介绍:https://www.rabbitmq.com/getstarted.html
Tps:官方还提供了第7种发布者确认模式,是实现可靠发布的RabbitMQ扩展。
1.5 常用术语
- 生产者(Produer)
生产代表发送,发送消息的服务就是生产者(Producer)。
- 队列(Queue)
队列可以看做是RabbitMQ内部的“邮箱”,消息经过队列并进入应用程序,消息即存储在队列中(消息缓冲器)。
- 消费者(Consumer)
消费与接收具有相似的意义。一个消费者是一个服务,主要是等待接收消息。
- 交换机(Exchange)
接收消息,根据路由键转发消息到绑定的队列中,常用的有广播fanout、定向direct和通配符topic三种类型。
1.6 交换机 和 工作模式关系
- 不直接使用Exchange交换机(默认交换机)
1、simple简单模式:一个生产者生产一个消息到一个队列,并被一个消费者接收;
2、work工作队列模式:生产者发送消息到一个队列中可以被多个消费者监听该队列;
- 使用Exchange交换机
1、发布与订阅:使用了fanout广播类型交换机,可以将一个消息发送到所有绑定了该交换机的队列
2、路由模式:使用了direct定向类型的交换机,消息会携带路由key,交换机根据消息路由key与队列路由key进行对比,
一致的话那么该队列可以接收到消息
3、通配符模式:使用了topci统配符类型的交换机,消费会携带路由key(*,#),交换机根据消息路由key与队列路由key进行对比,匹配的话那么该队列可以接收到消息。——更加灵活