1.介绍消息队列的作用?
- 解耦:发件人与收件人不直接对接,而是由中间件消息队列中转,降低耦合度。
- 支持异步:发布者只负责发布,接受者只需要到中间件队列获取消息。
- 提升性能:不用考虑接受者有多少个,发布者只需要向中间件队列发送一次消息。
- 故障隔离:发布者与接受者分离,接受者与接受者分离。
-
2. 常见的mq产品?
RabbitMQ、ActiveMQ、RocketMQ、kafka;差异点如下:
3.rabbitmq支持哪些消息模式?
基本模式 Simple
- 工作模式 Work
- 广播模式 Fanout
- 路由模式 Driect
-
4.什么是AMQP协议模型?
AMQP协议是一个开放的标准的的协议,它定义了系统之间如何传递消息。结构图如下:
Publisher:消息发布者
Broker: 中间件
Virtual Host:虚拟主机
Exchange: 交换机
Queue: 消息队列
Channel: 频道
Consunmer: 消息订阅者5.消息转换器的作用?
默认采用的是JDK序列化字符串,阅读性差,占内存多;而消息转换器可以进行格式转换,减少数据大小,提升阅读性,常用的有JSON转换器。
转换后:
6. rabbitmq如何保证消息的可靠性?
消息生产者方面
消息确认publisher-confirm,确保消息发送到了交换机。返回ack,true代表发送成功。
消息回执publisher-return,确保交换机将消息路由到了绑定的消息队列。返回ack,ture代表发送成功
- MQ方面
交换机的持久化(声明时持久化设置为true)
消息队列的持久化(声明时持久化设置为true)
消息的持久化(默认)
- 消息消费者方面
消费者消息确认,三种确认模式,
manual —> 手动ack
auto —>自动ack,由spring托管,没有异常返回ack;抛出异常返回nack,若异常一直未处理,会出现无限重试现象。
none —> 关闭ack
消费失败重试机制
参数:重试时间 时间因子 最大重试数
重试策略:超过最大重试数后丢弃,或转存到自定义消息队列,将错误消息投递到错误交换机,交给人工处理。
7.rabbitmq如何避免消息堆积?
- 增加消费者数量,使消费速度大于生产速度
- 消费消息时设置线程池,增大消费效率
- 增大存储容积(惰性队列)
惰性队列是将原本存储在内存的消息转存到磁盘中,从而增大了存储容积,避免了消息的堆积。
8.rabbitmq如何防止消息重复消费?
- 设置消费ID,消费前先查询下消息是否消费过
-
9.rabbitmq如何保证高可用?
普通集群,是一种分布式集群,将队列分散到集群的各个节点,从而提高整个集群的并发能力。当访问集群某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回,但队列所在节点宕机,队列中的消息就会丢失。
- 镜像集群模式,是在普通集群的模式上增加了主从备份功能,保证了每个节点消息的同步性,但由于网络延迟,消息的一致性有所欠缺。