RabbitMQ补偿机制与@RabbitListener注解原理

补偿机制

RabbitMQ 默认情况下,如果消费者程序出现异常的情况下,会自动实现补偿(重试)机制

即队列服务器发送补偿请求

@RabbitListener原理

@RabbitListener 底层使用 AOP 进行拦截

  • 如果程序没有抛出异常,则会自动提交事务
  • 如果程序捕捉到异常信息,会自动实现补偿机制,该消息会缓存到 RabbitMQ服务端中,一直重试到不跑出异常为止

补偿机制一直重复显然是会占用资源的,所以我们可以尝试修改补偿机制

image-20220208170032702

当超过最大重试次数之后,消息队列默认就会放弃这条消息。

针对不同的情况也可以将消息发送到死信队列中,由专门的消费者进行处理,避免占用过多的资源

如何选择合理的补偿机制

情况一

1
消费者获取到消息后,调用第三方接口,但接口暂时无法访问,是否需要重试?

需要

接口可能是由于网络延时导致接口无法访问,是属于正常现象

情况二

1
消费者获取到消息后,抛出数据转换异常,是否需要重试?

不需要

因为重试的原因是抛出了异常,再重试多次也无济于事,所以是消费者内部的原因,需要消费者内部修正


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!