1.可能抛出异常 算消费失败
RabbitMQ自动补偿机制触发:
- 当我们的消费者在处理我们的消息的时候, 程序抛出异常情况下 (默认是无限次数重
试) - 应该对我们的消息重试设置间隔重试时间,比如消费失败最多只能重试5次,间隔3s.
铺垫就是为了防止重复消费的问题(为了解决幂等问题)
重试5次之后:
重试:
不会重试:
重试还是失败的情况下应该如何处理呢
如果重试5次,也就是15s内重试还是失败的情况下应该如何处理呢?.
默认的情况下,重试多次还是失败的情况下:
1.自动该消息删除
: (消息可能会丢失)
解决思路:
A.如果重试多次还是失败的情况下,最终存放到死信队列;
B.采用表日志记录消费失败错误的日志记录后期人工自动对该消息实现补偿。
消费失败:。
1.消费者方法报错.
2.手动ack告诉消费失败.
6. 如何合理选择消息重试机制
1.消费者获取消息后,调用第三方接口,但是调用第三方接口失败呢? (需要自动重试)是否需要重试
吗?
2.消费者获取消息后,因为代码问题抛出数据转换异常,(不需 要重试,需要重新发布版本)是否需要
重试?
总结:
如果消费者处理消息时,因为代码原因抛出异常是需要从新发布版本才能解决的,那么就不需
要重试,重试也解决不了该问题的。存放到死信队列或者是数据库表记录、后期人工实现补偿。
7.代码
生产者:
消费者:
最后一次重试成功:
8、mq 确认消费
开启ack:
9、什么是消息幂等性?. MQ消费者如何保证幂等性?
产生的原因:就是因为消费这可能会开启了自动重试,重试过程中可能会导致消费者业务逻
辑代码重复执行。。
数据库会再次插入,产生相同数据。
通过全局id来避免幂等性问题:
如何解决MQ消费者幂等性问题
就是采用全局的id
全局的id是根据业务场景来定.
- 消费者往数据添加订单 在数据库中存在该笔订单数据.
- 消费者发送邮件要 能够上用户看到消息