1.生产者可靠
首先要配置RabbitMQ的生产者的失败重连机制,如此就可以避免由于网络波动导致的消息发送失败问题
如果是由于其他原因导致的失败,RabbitMQ还支持生产者确认机制,当发生消息到MQ时会返回一个ACK的回执,如果发送失败会返回一个NACK的回执
以上手段都会导致性能下降
2.MQ可靠
数据持久化:MQ重启后仍然存在,不会丢失
交换机持久化(默认持久化)
队列持久化(默认持久化)
消息持久化:将Delivery mode 设置为 2 - Persistent
Spring中RabbitTemplate发送消息默认是持久化
LazyQueue:惰性队列
- 接收到消息后直接存入磁盘而非内存(内存中只保留最近的消息,当前版本默认2048条)
- 消费者要消费消息时才会从磁盘中读取并加载到内存
- 支持数百万条的消息存储
3.12版本之后,所以的队列都是LazyQueue,无法更改
3.消费者可靠性
消费者确认机制
为了确认消费者是否成功处理消息,RabbitMQ提供了消费者确认机制。当消费者处理消息结束后,应该向RabbitMQ发送一个回执,告知RabbitMQ自己消息处理状态。回执有三种可选值:
- ack:成功处理消息,RabbitMQ从队列中删除该消息
- nack:消息处理失败,RabbitMQ需要再次投递消息
- reject:消息处理失败并拒绝该消息,RabbitMQ从队列中删除该消息
SpringAMQP已经实现了消息确认功能。并允许我们通过配置文件选择ACK处理方式:
- none:不处理。消息投递给消费者后立刻ACK,消息立刻从MQ中删除。非常不安全
- manual:手动处理,手动在业务代码中调用api,返回ack或reject,存在业务入侵,但更灵活
- auto:自动模式,利用AOP对消息处理逻辑进行环绕通知,当业务正常执行时返回ack,否则如果业务异常自动返回nack,如果消息处理或校验异常自动返回reject
spring.rabbitmq.listener.simple.acknowledge-mode=auto/none/manual
失败重试机制
当消费者出现异常后,消息会不断地重新入队到队列,再重新发送给消费者,然后再次异常,再次重新入队,无限循环,导致mq消息处理飙升,造成不必要的压力
使用Spring的retry机制
失败消息处理策略:
在开启重试模式后,重试次数耗尽,如果消息依然失败,则需要有MessageRecoverer接口来处理,它包含三种不同的实现:
- RejectAndDontRequeueRecoverer:重试耗尽后,直接reject,丢弃消息。默认就是这种方式
- ImmediateRequeueMessageRecoverer:重试耗尽后,返回nack,消息重新入队
- RepublishMessageRecoverer:重试耗尽后,将失败消息投递到指定的交换机
将失败处理策略改为RepublishMessageRecoverer:
1.首先,定义接受失败消息的交换机,队列及其绑定关系;
2.然后,定义RepublishMessageRecoverer
版权归原作者 szphhh 所有, 如有侵权,请联系我们删除。