MQ面试题

一,谈谈MQ的优势?

mq的优势有,延迟队列,死信队列,可以实现信息幂等性,信息的可靠性

二,为什么使用mq?

异步处理,应用解耦,流量削峰

三,什么是死信?什么是死信队列?死信队列的作用?如何使用死信队列?

死信:

  1. 信息被拒绝访问
  2. 消费者发生异常,超过重试次数 。 其实spring框架调用的就是 basicNack
  3. 消息的Expiration 过期时长或队列TTL过期时间(信息过期或该信息所在的队列过期)
  4. 消息队列达到最大容量

死信队列:

死信队列就是用于储存死信的消息队列,在死信队列中,有且只有死信构成。

死信队列会绑定这一个普通的业务消息队列,业务消息队列中有消息变成死信了,这个消息就会重新被交换机路由到指定的死信队列中去。

死信队列的作用:

保证消息不丢失

死信队列的使用:

需要在声明业务队列的时候,绑定指定的死信交换机(exchange)和RoutingKey即可。(死信交换级是逻辑是的死信交换机,本质和普通交换机一样)

四,什么是延迟队列?延迟队列的使用场景?如何使用延迟队列?

延迟队列:

顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。 

延迟队列使用场景:

根据这一特性,延迟队列的使用场景有:

  1. 定时发布文章
  2. 秒杀之后,给30分钟时间进行支付,如果30分钟后,没有支付,订单取消。
  3. 预约餐厅,提前半个小时发短信通知用户。等等

延迟队列如何使用: 

第一种方式:创建具有超时功能且绑定死信交换机的消息队列

监听死信队列,即可处理超时的消息队列

缺点:

上述实现方式中,ttl延时队列中所有的消息超时时间都是一样的,如果不同消息想设置不一样的超时时间,就需要建立多个不同超时时间的消息队列,比较麻烦,且不利于维护。

第二种方式:创建通用延时消息 

缺点:

该种方式可以创建一个承载不同超时时间消息的消息队列,但是这种方式有一个问题,如果消息队列中排在前面的消息没有到超时时间,即使后面的消息到了超时时间,先到超时时间的消息也不会进入死信队列,而是先检查排在最前面的消息队列是否到了超时时间,如果到了超时时间才会继续检查后面的消息

第三种方式:使用rabbitmq的延时队列插件,实现同一个队列中有多个不同超时时间的消息,并按时间超时顺序出队

使用延迟队列插件,在创建新的交换机时把类型设置为x-delayed-message

五,Redis如何保证信息的可靠性?

消费端信息的可靠性

  1. 消费确认
  2. 死信队列

生产端信息的可靠性

  1. 消息持久优化
  2. 确认(Confirm)机制


六,如何保证信息的幂等性?

幂等性保证的基本原则

生产端:

状态检查:在消息发送前,先查询数据库,确认此消息是否已被处理过。如果是,则直接忽略;否则,继续处理,并在处理完成后更新消息状态为已处理。

消费端:

唯一标识:每个消息都携带一个全局唯一的ID或业务ID(BizId),如订单号、交易流水号等,以便在消费端能够识别重复的消息。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值