微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
服务异步通讯
文章目录
- 微服务框架
- 服务异步通讯
- 50 消息可靠性
- 50.4 失败重试机制
- 50.4.1 消费者失败重试
50 消息可靠性
50.4 失败重试机制
50.4.1 消费者失败重试
OK,上回我们已经实现了消费者 的确认机制,
这种机制就能够确保 消息至少能被消费者 消费一次
不过这种模式也有一个问题:当消费者消费失败后,它会返回nack,这样消息会回到MQ 的队列中,这种消费者又监听到了,但是又消费失败,就出现 了上节中的刷屏画面
如果代码没问题,可能消息最终可以被消费掉,但是如果代码本身有问题
这样就会一直“踢皮球”,给服务器带来很多的压力
【消费者失败重试机制】
当消费者出现异常后,消息会不断requeue(重新入队)到队列,再重新发送给消费者,然后再次异常,再次requeue,无限循环,导致mq的消息处理飙升,带来不必要的压力:
我们可以利用Spring的retry机制,在消费者出现异常时利用本地重试,而不是无限制的requeue到mq队列。
【牛逼!!】
试试
retry:
enabled: true
initial-interval: 1000
multiplier: 3
max-attempts: 4
修改一下监听
package cn.itcast.mq.listener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class SpringRabbitListener {
@RabbitListener(queues = "simple.queue")
public void listenSimpleQueue(String msg) {
log.debug("消费者接收到simple.queue的消息:【" + msg + "】");
System.out.println(1 / 0);
log.info("消费者处理消息成功!");
}
}
OK, 直接启动服务,MQ 里的那条消息还在
牛逼牛逼,注意时间,间隔1秒,3秒,9秒,一共重试 4次
四次之后就直接抛了,这个消息就会被拒绝掉
看看控制台
消息已经无了,就算没有消费成功,因为重试次数没了,直接拒绝了【即丢弃消息】
这是Spring 重试默认的处理机制,但是这样就把消息丢了,好像也不太好,虽然没啥问题,不丢掉就会一直耗着
【除了丢弃,还有其他的策略吗?】【当然】