1、什么是MQ?优劣势有那些?
- MQ是在消息的传输过程中保存的消息的容器,多用于分布式系统之间进行通信
- MQ,是一种跨进程的通信机制,用于上下游传递消息在互联网架构中
- MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务使用了MQ之后
- 消息发送上游只需要依赖MQ,不用依赖其他服务。
优势
- 应用解耦:减少程序的耦合程度,进而提高系统的维护性
- 提高容错性和可维护性
- 异步提速:提升系统的性能
- 提升用户体验和系统吞吐量
- 削峰填谷:减少高峰时期的并发请求的压力,提高系统的稳定性
- 提高系统稳定性
劣势
- 系统可用性降低
- 系统复杂度提高
2、JMS和AMQP的区别是?
- JMS即Java消息服务应用程序接口,是一个Java平台中关于面向消息中间件的API
- AMQP一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计
- 通信平台的区别
- JMS: 只允许基于JAVA实现的消息平台的之间进行通信
- AMQP: 允许多种消息协议进行通信,比如ruby的storm和java的jms都可以在AMQP上进行通信。
结论: AMQP允许多种技术同时进行协议通信
- 通信机制的区别
- JMS:消息生产者和消息消费者必须知道对方的Queue
- AMQP: 消息生产者和消息消费者无须知道对方的Queue,消息生产者将Exchange通过Route key和任意Queue绑定。
消息消费者通过Route key从任意Queue中获取Exchange
消息传输机制的区别
- JMS:JMS支持PTP和publis/subscribe机制,PTP只可以点对点通信,public/subscribe在一端发出请求后所有其他端收到消息
- AMQP:
- 所有RouteKey相同的Queue接受到数据
- 所有相同的Exchange的Queue接受到数据
- 所有wilecard的Exchange的Queue接受到数据
- 可以让webservice等接受到数据
3、如何docker安装rabbitmq?
- docker search rabbitmq
- docker pull rabbitmq:3-management
- docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
4、rabbitmq有几种工作模式?他们的区别是?
简单队列模式
- 不用显示声明交换机,只需声明一个队列
- 生产者指定队列名发送消息给MQ,然后会有一个默认的交换机将消息转发给这个队列。
- 消费者负责监听这个队列,一有消息就会得到通知做出响应
工作队列模式(Work queues)
- 和简单队列模式基本一样,不过有一点不同,该模式有多个消费者在监听队列
- rabbitmq会以轮询的方式将消息发给多个消费者确保一条消息只会被一个消费者消费
发布订阅模式(Publish/subscribe)
- 和上面2种模式默认提供交换机不同的是,该模式需要显示声明交换机,
- 然后可以创建多个队列和这个交换机进行绑定。
- 生产者发消息给MQ时需要指定交换机,然后交换机将消息转发给与自己绑定的所有队列
- 消费者监听指定的队列获得消息。每个队列可以有多个消费者监听,同样也是以轮询的机制发给消费者。
Routing 模式
- 和发布订阅模式不同的是,队列绑定交换机时需要指定一个routingkey
- 那么生产者发送消息时不仅需要指定交换机还需要指定routingkey
- 这样的话交换机就会把消息转发给跟自己绑定并且routingkey相匹配的队列
Topic模式
- 和Routing模式唯一的不同就是可以设置带有通配符进行模糊匹配的routingkey
heard模式
- 和Routing模式的不同就是 取消了routing 使用键值对的方式作为routing
5、如何使用原生API发送消息?
- 创建连接工厂
- 设置连接MQ的参数
- 创建连接
- 创建队列
- 发送消息
- 释放资源
6、如何使用原生API接收消息?
- 创建连接工厂
- 设置连接MQ的参数
- 创建连接
- 创建连接的管道
- 创建队列(声明队列的名称和设置基本信息)
- 接受消息
7、SpringBoot如何集成Rabbitmq?如何发送消息和如何接收消息?
发送消息
- 导入RabbitMQ的maven依赖
- 定义配置类
- 配置连接MQ的基本参数
- 注入RabbitTemplate
- 调用发送方法
接收消息
- 定义类监听消息
- 在类的方法上面加上@RabbitListener(queues = “要监听的队列名称”)
- 方法的参数message获取队列的消息