问题描述: 大致的原因是因为当天服务器出现问题,导致我们使用的rocketMq出发的消息重试机制,由于开发的的项目是IM的,所有导致我们根据业务的消息id会把之前client端收到的消息进行覆盖。问题详见下图:
过程描述: 1、消息发送方,发送消息1,由于网络通讯或其他问题导致mq的消息重试机制,会存在一条同样的消息在mq中出现多次,我们设置的默认重试次数是两次(就是说mq中最多可能存在3条一样的消息)。 2、客户端最终消费了消息1中的某一条消息,还存在消息1没被消费的消息。 3、发送方,发送消息2,根据第一次发送消息异步返回的业务内部的消息id,发送对之前的消息进行覆盖的消息(消息覆盖,类似审批从 待审核=》审核完成) 4、客户端消费了消息2的消息,并对展示的消息1进行覆盖。(注意:这个时候消息1还有没被消费的) 5、这个时候消息1的另外的消息被客户端消费,导致类似ABA的问题
说明:客户端是根据业务方的msgId对客户端的消息进行覆盖
解决方案: 出现了ABA的问题,立刻想到版本号来避免,根据业务想到步骤号(类似 1,2,3,4.....),对于自身的业务来说可以设置一个步骤号,这样在做覆盖的时候判断一下此次的消息是否在之前的消息步骤之后,不是之后则过滤,是之后则覆盖。解决问题