一,谈谈MQ的优势?
mq的优势有,延迟队列,死信队列,可以实现信息幂等性,信息的可靠性
二,为什么使用mq?
异步处理,应用解耦,流量削峰
三,什么是死信?什么是死信队列?死信队列的作用?如何使用死信队列?
死信:
- 信息被拒绝访问
- 消费者发生异常,超过重试次数 。 其实spring框架调用的就是 basicNack
- 消息的Expiration 过期时长或队列TTL过期时间(信息过期或该信息所在的队列过期)
- 消息队列达到最大容量
死信队列:
死信队列就是用于储存死信的消息队列,在死信队列中,有且只有死信构成。
死信队列会绑定这一个普通的业务消息队列,业务消息队列中有消息变成死信了,这个消息就会重新被交换机路由到指定的死信队列中去。
死信队列的作用:
保证消息不丢失
死信队列的使用:
需要在声明业务队列的时候,绑定指定的死信交换机(exchange)和RoutingKey即可。(死信交换级是逻辑是的死信交换机,本质和普通交换机一样)
四,什么是延迟队列?延迟队列的使用场景?如何使用延迟队列?
延迟队列:
顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。
延迟队列使用场景:
根据这一特性,延迟队列的使用场景有:
- 定时发布文章
- 秒杀之后,给30分钟时间进行支付,如果30分钟后,没有支付,订单取消。
- 预约餐厅,提前半个小时发短信通知用户。等等
延迟队列如何使用:
第一种方式:创建具有超时功能且绑定死信交换机的消息队列
监听死信队列,即可处理超时的消息队列
缺点:
上述实现方式中,ttl延时队列中所有的消息超时时间都是一样的,如果不同消息想设置不一样的超时时间,就需要建立多个不同超时时间的消息队列,比较麻烦,且不利于维护。
第二种方式:创建通用延时消息
缺点:
该种方式可以创建一个承载不同超时时间消息的消息队列,但是这种方式有一个问题,如果消息队列中排在前面的消息没有到超时时间,即使后面的消息到了超时时间,先到超时时间的消息也不会进入死信队列,而是先检查排在最前面的消息队列是否到了超时时间,如果到了超时时间才会继续检查后面的消息
第三种方式:使用rabbitmq的延时队列插件,实现同一个队列中有多个不同超时时间的消息,并按时间超时顺序出队
使用延迟队列插件,在创建新的交换机时把类型设置为x-delayed-message
五,Redis如何保证信息的可靠性?
消费端信息的可靠性
- 消费确认
- 死信队列
生产端信息的可靠性
- 消息持久优化
- 确认(Confirm)机制
六,如何保证信息的幂等性?
幂等性保证的基本原则
生产端:
状态检查:在消息发送前,先查询数据库,确认此消息是否已被处理过。如果是,则直接忽略;否则,继续处理,并在处理完成后更新消息状态为已处理。
消费端:
唯一标识:每个消息都携带一个全局唯一的ID或业务ID(BizId),如订单号、交易流水号等,以便在消费端能够识别重复的消息。