MQ消息队列
- 1.项目重启:docker的编排启停指令。
- 2.同步和异步的区别:
- 3.同步调用的问题
- 4.异步调用方案:
- 5.同步异步如何选择:
- 6.常见的消息队列和选择:
- 8.rabbitMQ端口:
- 9.消息模式:
- 10.RabbitMQ中的一些角色:
- 11.virtualHost虚拟主机:
- 12.什么是SpringAMQP:
- 13.消息堆积问题怎么解决:
- 14.work的能者多劳:
- 15.交换机的作用是什么?
- 16.声明队列、交换机、绑定关系的Bean是什么?
- 17.点对点和订阅模式的简单区分:
- 18.队列存储消息只要不取能一直存?
- 19.队列可以在消费者创建,也可以在生产者创建
- 20.交换机和队列可以绑定路由规则。路由规则通配符:#,*。
- 21.队列到底能存多长时间
- 22.一个服务器能创建多少交换机,多少队列啊
- 23.这个消息队列没有事务,消息丢失的话看日志,手动修改。
- 24.收,发消息:都要设置消息转换器。用json
- 25.`Routingkey` 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: `china.news`
- 26.总结一下mq的注解。
- 27.为什么要再启动类上写@bean???
1.项目重启:docker的编排启停指令。
2.同步和异步的区别:
同步通讯:就像打电话,需要实时响应。(不能跟多个人同时通话)
异步通讯:就像发微信,不需要马上回复。(可以跟多个人通话,但响应会有延迟。)
3.同步调用的问题
dubbo和feign 是同步发送请求。
新增功能会有耦合度高,
耗时也会增加,只能串联顺序执行。
网络波动服务忙
级联失败。
微服务间基于Feign的调用就属于同步方式,存在一些问题
- 耦合度高:每次加入新的需求,都要修改原来的代码
- 性能下降:调用者需要等待服务提供者响应,如果调用链过长则响应时间等于每次调用的时间之和。
- 资源浪费:调用链中的每个服务在等待响应过程中,不能释放请求占用的资源,高并发场景下会极度浪费系统资源
- 级联失败:如果服务提供者出现问题,所有调用方都会跟着出问题,如同多米诺骨牌一样,迅速导致整个微服务群故障
4.异步调用方案:
异步调用通过事件驱动模式(Broker)来解决上面同步调用问题
- 耦合度低:每个服务都可以灵活插拔,可替换
- 性能提升:无需等待订阅者处理完成,响应更快速
- 故障隔离:服务没有直接调用,不存在级联失败问题
- 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件
5.同步异步如何选择:
-
实时响应用同步
-
其他可以用异步
6.常见的消息队列和选择:
1)RabbitMQ、ActiveMQ、RocketMQ、Kafka
2)选择:消息延迟和单机吞吐量成反比
如果数据量一般用RabbitMQ
海量数据用kafka
rocketmq属于综合能力好。
8.rabbitMQ端口:
浏览器访问mq端口:15672
java后台访问mq端口:5672
9.消息模式:
点对点:相当于私聊,一个消息只能被一个消费者接收
发布/订阅:微信群聊,一个消息可以被多个消费者接收
rpc同步调用,实际用的很小。
10.RabbitMQ中的一些角色:
- publisher:生产者
- consumer:消费者
- exchange个:交换机,负责消息路由
- queue:队列,存储消息
- virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离
11.virtualHost虚拟主机:
一个项目创建一个账号并且创建一个虚拟主机,账户和主机之间进行关联。
虚拟主机之间是相互隔离的。相当于mysql里的库。
12.什么是SpringAMQP:
AMQP:是用于在应用程序之间传递业务消息的开放标准。该协议与语言和平台无关,更符合微服务中独立性的要求。
AMQP:是一个高级队列协议,跟语言和平台无关
SpringAMQP:是基于java语言实现AMQP协议的一套API规范
SpringAMQP:通过封装rabbitMQ原生代码实现mq消息发送和接口
13.消息堆积问题怎么解决:
work消息模型:可以做消费者集群。
14.work的能者多劳:
默认:不管消费者性能快还是慢,都是按总数平均分配。
消费者性能不一致时:加配置prefetch:1开启能者多劳模式。
15.交换机的作用是什么?
-
接收publisher发送的消息
-
FanoutExchange的会将消息路由到每个绑定的队列
-
不能缓存消息,路由失败,消息丢失
16.声明队列、交换机、绑定关系的Bean是什么?
- Queue
- FanoutExchange
- Binding
17.点对点和订阅模式的简单区分:
一个队列是点对点,多个队列是订阅模式。
不绑定队列,消息不会被暂存,会丢失消息。
消费者只能监听队列,不能直接绑定交换机。
18.队列存储消息只要不取能一直存?
看硬盘空间,堆积过多会挂。
19.队列可以在消费者创建,也可以在生产者创建
20.交换机和队列可以绑定路由规则。路由规则通配符:#,*。
21.队列到底能存多长时间
可以做持久化,没宕机可以一直存。
22.一个服务器能创建多少交换机,多少队列啊
至少十几个交换机,上百个队列。
china.*.*也支持
23.这个消息队列没有事务,消息丢失的话看日志,手动修改。
24.收,发消息:都要设置消息转换器。用json
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
json:空间小,跨平台,可读性好
25.Routingkey
一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: china.news
通配符规则:
#
:代指0个或多个单词
*
:代指一个单词
26.总结一下mq的注解。
监听队列
@RabbitListener(queues = "simple.queue")
创建交换机、队列和路由规则并监听
@RabbitListener(bindings =@QueueBinding(
value = @Queue("direct.queue1"),
exchange = @Exchange(name = "direct.exchange",type = ExchangeTypes.DIRECT),
key = {"vip","base"}//key = "china.#"
))
//监听并创建队列
@RabbitListener(queuesToDeclare = @Queue("object.queue"))
27.为什么要再启动类上写@bean???
在配置类上写不行吗。