简单介绍
什么是MQ?
MQ 是Message Queue的缩写,也就是消息队列的意思。
MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。
它最主要的三个特点:
- 消峰
- 解耦
- 异步
消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。
AMQP 与 JMS
MQ主流的实现方式有两种:AMQP 和 JMS
AMQP 是一个提供统一消息服务的应用层标准高级消息队列协议
JMS 是 java 中一个api,它为java提供了统一的消息操作,它jdbc比较类似
它俩之间的联系与却别:
- JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
- JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的
- JMS规定了两种消息模型;而AMQP的消息模型更加丰富
常见的消息队列:
- ActiveMQ:基于JMS
- RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好
- RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会
- Kafka:分布式消息系统,高吞吐量
图解关系
一张图送给大家:
之前的写过 RabbitMQ以及它Web端图形化界面的安装 ,大家可以根据图像化界面去了解一下RabbitMQ中Virtual Host 、 Exchange 、 Queue 、 Channel 之间的关系。
引入基本依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置文件
使用yml类型的配置文件
spring:
rabbitmq:
host: 39.97.12.34 ## ip
username: eric
password: eric
virtual-host: rabbitmq # 指定虚拟机
template:
exchange: lk.item.exchange # 指定默认交换机
publisher-confirms: true # 如果消息发送失败,会有ack,触发重试机制
消息提供者
// springboot用于测试的两个注解
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MQApplication.class)
public class SpringSenderTest {
// 自动注入 AmqpTemplate
@Autowired
private AmqpTemplate amqpTemplate;
@Test
public void testSend() throws InterruptedException {
String msg = "hello, Spring boot amqp";
// 第一个参数: 指定发送的交换机
// 第二个参数: 指定RoutingKey
// 第三个参数: 指定发送的消息
this.amqpTemplate.convertAndSend("spring.test.exchange","a.b", msg);
// 等待10秒后再结束
Thread.sleep(10000);
}
}
在图形化界面中的交换机
消息的监听者
@Component
public class Listener {
@RabbitListener(bindings = @QueueBinding(
// 设置选择队列名称
value = @Queue(value = "spring.test.queue",durable = "true"),
exchange = @Exchange(
value = "spring.test.exchange", // 选择交换机的名称
ignoreDeclarationExceptions = "true", // 消息持久化
type = ExchangeTypes.TOPIC // 选择可用topic的交换机
),
// 指定 routingKey,使用通配符,直接匹配上边的 a.b
key = {"#.#"}))
// 参数类型,应与消息发送者发送消息类型保持一致
public void recv(String msg){
System.out.println(msg);
}
简做总结,如有不足,欢迎指出!