作者太懒了,总觉得做出来就会了,看过也会了
为什么要使用mq ?
解耦+异步:
抗压:
RabbitMQ基础知识讲解
RabbitMQ的安装
RabbitMQ工作模式 - 发送端和接收端封装
RabbitMQ - 五种工作模式 - 简单模式和work工作模式
RabbitMQ - 五种工作模式 - 订阅模式
RabbitMQ - 五种工作模式 - 路由模式
RabbitMQ - 五种工作模式 - 主题模式
问题一:RabbitMQ - 消息持久化和手动应答
ack手动应答,确认使用了消息,否则下次还可以继续使用之前的消息
mq.ack(false)
问题2:假设其中一个消费者出现故障?怎么办
答:多消费者消费消息、重新入列
reject(true) //false:可以不接受 true:接收队列到其它消费端
问题三:消费者限流:ACK后再收新消息(根据业务情况)
mq.Channel.Qos(1,0,false)//参数prefetchCount,prefetchSize,global
问题四:发送消息到MQ是否会失败呢?会。如何获取失败的消息
答:开启Confirm模式、记录失败的消息
mq.Channel.Confirm(false)//参数:NoWait
监听,具体代码自己体会
当服务器故障什么的,需要记录消息到数据库(或其它),用其它服务或者服务重启后,继续执行剩下的任务(邮件/用户注册送积分等)
问题五:如果发送消息到达了MQ,那么没有进入队列该怎么得知呢?
监听消息入列回执:NotifyReturn的用法
mq.Channel.Publish()//生产者参数:mandatory设置为true
mandatory解释 :
如果为true,在exchange正常且可到达的情况下。如果exchange+routeKey无法投递给queue,那么MQ会将消息返还给生产者;
如果为false时,则直接丢弃
异步监听回执,具体代码自己体会
问题六:当我们对新增的用户进行邮件发送,如果发送失败应该怎么办?答:以用户注册为例产生的事务需求、延迟队列使用
一、使用延迟队列;
二、采取的策略是最多重发N次,那么怎么记录次数呢?MYSQL或者redis记录;
三、每次失败我们延长时间后再发,直至达到最大次数;
问题七:跨系统的分布式事务(跨公司或跨系统的转账),怎么做?
几点思考:
1、RabbitMQ有事务(暂时还没讲,涉及到多交换机发送时是有用的 ) 也可以confirm模式来获取失败的key,但这些其实都有可能会失败,这里面
1、日志表记录必须要成功。否则一切GG
2、如果第一步成功的一刹那,突然发生宕机。那么不管是事务还是confirm都有可能获取不到
“无脑”-补偿机制-交易失败后“还钱 ”
不管发送成功与否,
思路如下:
1、我们写个 “死循环”程序
2、定时取5秒或自定义N秒内 :status==0 的数据,再发一次消息//status= 0表示待处理的日志记录
3、设定--定时任务。定时清理300秒内(或自定义)status==0的消息,把它改为status=2 //status= 2表示转账失败的日志记录,进行补偿机制的“还钱”
RabbitMQ - 死信队列
有疑问加站长微信联系(非本文作者)