RabbitMQ消息丢失、积压、重复等解决方案

createh52个月前 (02-01)技术教程20

消息丢失#

1、只要订单完成我们就会发送一条消息给MQ,这个途中突然MQ服务器网络中断,导致消息无法抵达

做好容错方法需要在消息发送前加上异常处理

 try {
  rabbitTemplate.convertAndSend("order-event-exchange", "order.release.other", orderTo);
    } 
catch (Exception e) {
   //将没法送成功的消息进行重试发送
    }

还可以将消息存入数据库,把失败的消息定期重新再发一遍

2、当消息发送给MQ,通过Brock通过交换机抵达队列,MQ关机了,只有抵达队列才能实现消息持久化

这时候需要使用生产者的确认机制

只要消息收到了会自动持久化,如果进入另一个回调方法说明报错了,需要修改数据库使消息重发

3、自动ACK的状态下。消费者收到消息,但没来得及消息然后宕机

一定开启手动ACK,消费成功才移除,失败或者没来得及处理就noAck并重新入队

消息重复#

1、消息消费成功,事务已经提交,ack时,机器宕机。导致没有ack成功,Broker的消息重新由unack变为ready,并发送给其他消费者

在ack的时候宕机,导致消息没有确认,又需要重新发送

2、消息消费失败,由于重试机制,自动又将消息发送出去

关闭订单的时候,没有成功,又重新进入队列再次执行,这种是可以允许的

解决办法:

  • 消费者的业务消费接口应该设计为幂等性的。比如扣库存有工作单的状态标志
  • 使用防重表(redis/mysql),发送消息每一个都有业务的唯一标识,处理过就不用处理
  • rabbitMQ的每一个消息都有redelivered字段,可以获取是否是被重新投递过来的,而不是第一次投递过来的

判断当前消息是否是第二次及以后被派发过来的

消息积压#

  • 消费者宕机积压
  • 消费者消费能力不足积压
  • 发送者发送流量太大上线更多的消费者,进行正常消费上线专门的队列消费服务,将消息先批量取出来,记录数据库,离线慢慢处理

这也是实现了柔性事务-可靠消息+最终一致性解决方案

做好消息确认机制(生产者、消费者)+手动确认机制

相关文章

JavaWEB前端向服务器端发送对象(java向服务器发送数据)

最近项目中需要做一个关于批量删除的功能,删除条件有多个,需要从页面全部传给后台服务器程序,单个的删除,可以拼接参数给url,服务器端获取参数后执行删除操作即可。但是批量删除多个,参数会很多,传递就有些...

学习必备|分布式即时通讯服务端java版附源码

今日推荐:分布式即时通讯服务端推荐一款基于java开发的分布式即时通讯服务端,网络基于netty,akka实现实时信息,提供简单的API服务 ,方便二次开发。特点:1、支持单击部署,也支持集群部署2、...

JVM学习笔记之Client Server端的区别

java -version 命令大家都用过,大部分就是看下jdk版本或检查下环境变量的设置,但最后一行的信息也挺重要,如下图所示:Server VM表示我们的虚拟机类型,mixed mode表示虚拟机...

微服务架构模式:让自己对BFF层有个了解——服务于前端的后端

BFF用于前端的后端◎ 回顾前后端分离发展史◎ BFF诞生◎ 基于RESTful的BFF◎ 基于GraphQL的BFF随着前端技术的大爆发,面对逐渐复杂化的前端工程体系,越来越多的企业开始采用前后端分...

java本地搭建宝塔部署实战likeadmin后台系统源码server端(一)

大家好啊,我是测评君,欢迎来到web测评。上次分享了那几期likeadmin的搭建视频教程,由于是php开发的,这对有些习惯用java开发的同学不太友好,好在这套系统也有java版本的,也有朋友让我录...

前后端分离的开源在线考试系统调试实战

开篇在我们的教育生涯中,或多或少的都接触过在线考试系统。例如大学里最常见的各种软件考试,上机考试等,那么有没有开源的这样的系统呢?当然是有了,今天就来调试个开源的在线考试系统。本文重点是调试,因为很多...