RMQ消息发送失败处理
对于消息发送失败,可能会有多个不可控的因素造成:
1,发送消息的时候,网络不稳定
2,MQ服务器宕机
3,接收消息的服务挂掉,最终都会导致对数据库的操作失败
解决办法
一,发送者重连
在配置中开启重连机制,配置超时处理
此时如果发送失败,会继续尝试重新发送,还是失败程序结束
对于发送者重连有一个问题:因为 虽然convertAndSend
默认是非阻塞式的,但是重连机制是阻塞式的,它会影响主线程,重连的过程中当前线程是阻塞的,所以此时最后一句不会执行。它会等待重连的结果。
解决:如果将消息发送放到异步线程,即使阻塞也不会影响主线程
启动类上开启异步线程Async
使用@Async标记的方法会在单独的线程中运行,不会阻塞主线程,在主线程中调用异步线程
可以看到不仅尝试重连了,还没有阻塞主线程。
所以前面说消息发送本身是异步非阻塞的,前提是发送成功即发送的那一行不会抛出异常触发重连机制,不管发送成功或失败都交给异步进行处理,减少耦合与耗时。
还有发送者确认机制。
二,保证MQ可靠性
1,交换机,队列,消息的持久化(Message对象重构),保证消息可靠性。
2,懒队列,收到消息后直接存磁盘,跳过内存。3.12版本后默认都是懒队列。老版本需要自己配置。
三,消费者可靠性(有没有成功处理消息)
消费者确认机制以及消费者失败重试。
RMQ异步通信https://mp.csdn.net/mp_blog/creation/editor/143577224