工作中用到队列的地方越来越多,下面简单说下队列中RabbitMQ的相关知识:
1、同步与异步的区别
MQ相关知识点
同步调用的优点:
时效性较强 可立即得到结果
同步调用的缺点:
耦合度高
性能和吞吐能力下降
有额外的资源消耗
有级联失败的问题
异步通信的优点:
耦合度低
吞吐量提升
故障隔离
流量削峰
异步通信的缺点:
依赖Broker的可靠性。安全性、吞吐能力
架构复杂了 业务没有明显的流程线、不好追踪管理
2、简单队列
SpringAMQP 快速入门
简单队列案例实现(单个队列 单个消费者):
SpringAMQP如何发送消息:
引入amqp的start依赖
yml配置RabbitMQ地址
利用RabbitTemplate的convertAndSend方法
SpringAMQP如何接收消息:
引入amqp的start依赖
yml配置RabbitMQ地址
定义类 添加@Component注解
类中声明方法 添加@RabbitListener注解(可自动监听接收队列中的消息)
注意:消息一旦消费就会从队列中删除 RabbitMQ没有消息回溯功能
3 、工作队列
work模型案例的使用(就是单个队列 多个消费着绑定到这同一个队列中进行消费):
多个消费者绑定到一个队列,同一条消息只会被一个消费者处理
通过在yml中设置prefetch来控制消费者预取的消息数量(设置为1 消费一条 取一条
4、发布与订阅---交换机
上面的简单队列以及工作队列 一条消息只能满足被一个消费者消费 不能多个消费者同时消费一条消息
为了满足将同一消息同时发送给多个消费者 增加了exchange(交换机)功能,发布者不再将消息直接传递给队列 而是先发送给交换机,再通过交换机传递给队列 主要有以下三个交换机实现方式
常见exchange 类型包括:
Fanout 广播
Direct 路由
Topic 话题
即发布订阅模型:
1、SpringAMQP-FanoutExchange
将消息通过交换机传递到每一个与之绑定的队列中
交换机的作用是什么
接收publicsher发送的消息
将消息按照规则路由到与之绑定的队列
不能缓存消息,路由失败,消-息丢失
FanoutExchange会将消息路由到每个绑定的队列
声明队列、交换机、绑定关系的Bean是什么
Queue
FanoutExchange
Binding
2、SpringAMQP-DirectExchange
将消息通过交换机根据RoutingKey判断路由传递到每一个与之绑定的队列中
描述下Direct交换机与Fanout交换机的差异
Fanout交换机将消息路由到每一个与之绑定的队列
Direct交换机根据RoutingKey判断路由给哪个队列
如果多个队列具有相同的RoutingKey 则与Fanout功能类似
基于@RabbitListener注解声明队列和交换机有哪些常见注解
@Queue
@Exchange
3、SpringAMQP-TopicExchange
将消息通过交换机根据RoutingKey通配符判断路由传递到每一个与之绑定的队列中
TopicExchange 与 DirectExchange 的区别
TopicExchange的RoutingKey中支持#通配符
SpringAMQP--消息转换器
SpringAMQP中消息的序列化与反序列化的实现方式:
利用MessageConvert实现的,默认的是JDK的序列化(启动类中重新MessageConvert 返回jacksond的序列化方式 即可)
注意发送方式与接收方式必须用相同的MessageConverter