(MQ消息队列)day67javaEE基础查漏补缺

本文探讨了如何使用docker编排管理和重启项目,对比同步与异步通信,解析同步调用问题及异步解决方案。重点讲解了RabbitMQ的使用、端口配置、消息模式、角色和SpringAMQP,还涉及了消息堆积、交换机、队列管理以及常见消息队列的选择策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.项目重启:docker的编排启停指令。

2.同步和异步的区别:

同步通讯:就像打电话,需要实时响应。(不能跟多个人同时通话)

异步通讯:就像发微信,不需要马上回复。(可以跟多个人通话,但响应会有延迟。)

3.同步调用的问题

dubbo和feign 是同步发送请求。
新增功能会有耦合度高,

耗时也会增加,只能串联顺序执行。

网络波动服务忙

级联失败。
微服务间基于Feign的调用就属于同步方式,存在一些问题

- 耦合度高:每次加入新的需求,都要修改原来的代码
- 性能下降:调用者需要等待服务提供者响应,如果调用链过长则响应时间等于每次调用的时间之和。
- 资源浪费:调用链中的每个服务在等待响应过程中,不能释放请求占用的资源,高并发场景下会极度浪费系统资源
- 级联失败:如果服务提供者出现问题,所有调用方都会跟着出问题,如同多米诺骨牌一样,迅速导致整个微服务群故障


4.异步调用方案:

异步调用通过事件驱动模式(Broker)来解决上面同步调用问题

- 耦合度低:每个服务都可以灵活插拔,可替换
- 性能提升:无需等待订阅者处理完成,响应更快速
- 故障隔离:服务没有直接调用,不存在级联失败问题
- 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

5.同步异步如何选择:

  1. 实时响应用同步

  2. 其他可以用异步

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???

在配置类上写不行吗。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值