昨天本地启动一个服务的时候,发现一个消费rabbit mq的地方抛出异常,而且不断的重复执行,debug发现每次都是消费的都是同样的数据,查资料发现是mq的自动确认机制导致的。
可参考这个
https://www.jianshu.com/p/f10161bf19c7
推荐使用自动重试机制。
自动重试机制会在本地重试一定次数,如果还是失败,则把消息放到死信队列,这样消息就不会无限重推了,但是此时需要专门写代码去处理死信队列的消息,不然无法检测消息失败的情况。
问题?
我在代码并没有调用ack,客户端是如何确认的消息?
原来是spring rabbit提供的自动确认的设置, acknowledge-mode=auto
的话,如果代码不抛异常,会帮我们提交ack到mq服务端,这也是为什么代码有异常之后,消息就无法确认了。
可参考
https://www.jianshu.com/p/8127ca9b8f35
最后,个人推荐的MQ设置方法:
1 生产者设置为人工ack,避免丢消息。
2 消费端设置自动重试1次,失败后丢入死信队列。
3 监控死信队列做业务报警。
网友评论