RabbitMq介绍
使用RabbitMq和不使用RabbitMq的区别
-
分布式通信方式:直接远程调用或者通过中间件完成间接通信
-
使用中间件:消息发送方称为生产者,消息接收方称为消费者。
-
图解:
使用RabbitMq有点和缺点
- 优点: 3点
- 应用解耦 : 将系统由原来的高耦合变为低耦合
- 异步提速: 调用者发送请求之后不需要等待,可以异步调用
不使用mq:
使用mq: * 削峰填谷 什么是削峰填谷呢?图解1:
复制代码
如果还是不明白削峰填谷还有第二张图解:
图解2:
-
劣势
-
系统可用性降低 : 系统稳定性差,如果mq宕机,就会对业务造成致命性的打击, 一般不会宕机因为要搭建集群,在一个就是RabbitMq也比较成熟了
-
系统负载性提高 原有方式直接调用,现在需要通过mq来进行交互。
-
数据一致性问题:
消息重复
消息丢失
消息消费失败
MQ常见产品
-
-
ActiveMQ:使用java开发,古老的产品,现在一般不使用,属于Apache
-
RabbitMQ:使用erlang语言开发,现在流行的mq产品,属于Rabbit
-
RockerMQ:使用java开发,脱胎于kafka,所以吞吐量在同类产品中占据优势,属于阿里。
- mq中的消息阅读完直接销毁
-
Kafka:一般用户大数据环境,属于Apache
- kafka中的消息是阅读完不会进行销毁,他有一个失效期
RabbitMq架构
执行流程
- 1:生产者与mq建立连接(TCP,类似于线程池)通过连接中的通道发送消息至mq的交换机(交换机不具备存储消息的功能),交换机将消息路由到对应的队列中.
- 2:消费者也是通过连接中的通道进行监听队列,拉取消息,完成消费
- 交换机不具备存储消息功能
- 队列完成消息的存储
- 交换机和队列都是属于v-host,mq默认v-host是 / ,作用: v-host 配合 用户 完成了权限控制. (这样使用的比较少)
复制代码
控制台简单介绍
控制台的默认端口是: 15672
默认的账号&密码: guest
复制代码
Rabbitmq五种发送消息的模式
官方介绍: https://www.rabbitmq.com/getstarted.html
复制代码
- 1: 简单模式
- 代码
yml 配置:
spring:
application:
name: spring-rabbitmq
rabbitmq:
host: 192.168.200.132
port: 5672
password: guest
virtual-host: /
username: guest
通过代码的方式创建队列:
@Configuration
public class QueueBean {
/**
* @program: day10
* @description:
* @author: Mr.Li
* @create: 2020-07-26 19:21
**/
// 创建队列
@Bean
public Queue queue() {
return new Queue("li_xian_sheng");
}
}
创建生产者:
@RestController
public class ProducerController {
/**
* @program: day10
* @description:
* @author: Mr.Li
* @create: 2020-07-26 19:24
**/
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("/sendMsg/{msg}")
public void sendMsg(@PathVariable String msg){
rabbitTemplate.convertAndSend("li_xian_sheng", msg);
}
}
消费者:
@Component
@RabbitListener(queues = "li_xian_sheng") // 设置监听的队列
public class ConsumerListener {
/**
* @program: day10
* @description:
* @author: Mr.Li
* @create: 2020-07-26 19:27
**/
@RabbitHandler // 转换
public void receiveMsg(String msg) {
System.out.println("执行了: " + msg);
}
RabbitHandler:作用是将接受到的数据格式进行一个转换
}
注意: 如果想要从队列中获取数据, 消费者的参数必须和生产者的参数一致
特点: - 只有一个消费者,消息阅后即焚
- 使用交换机是默认交换机
复制代码
- 2: 工作队列模式(work queue 多个消费者去监听一个队列)
工作队列模式特点:
- 在消费者之间进行轮训
- 消费者之间是竞争关系,消息阅后即焚
- 使用的交换机是默认交换机
复制代码
-
3:发布订阅模式
需要自己手动创建交换机,并绑定队列(可以绑定多个) 复制代码
* fanout exchange(广播类型交换机)
复制代码
示意图:
消费者发送请求到交换机,交换机会将消息路由到 a and b 消费者完成消费fanout模式特点:
- 需要手动创建交换机
- 需要完成交换机与队列的绑定
- 只要与交换机完成绑定的队列都可以接收到消息
复制代码
- direct exchange(Routing key--->点对点) 需要手动绑定路由
direct模式总结:
- 需要手动创建交换机
- 需要完成交换机与队列的绑定,需要指定routing key
- 只有满足与生产者发送方routing key相符的消息才可以从交换机路由至队列
复制代码
- topic exchange(主题模式)
topic模式总结:
- '*' 号匹配不多不少只有一个词
- '#'号匹配大于等于0个词
如果不满足路由键,消息会丢失因为交换机不能存储数据
复制代码