一、RocketMq解决业务端去重步骤:
1、记录下每个消息的msgID
2、新消息来的时候,查看该消息的msgID是否已记录,是则抛弃,否则消费
二、RocketMq一般用redis进行记录,该msg是否被记录
1、消费端接收到消息的时候,调用redis提供的incr自增方法,以msgID作为key(具有唯一性),value则默认从1开始递增。
2、当incr返回值为1时,设置其失效时间为两分钟以后(每个msgID保留两分钟足矣!),并且该消息需要被消费。
3、当incr返回的值大于1时,直接跳过,不消费。
public long incr(String key,Date Expirem){
long count=redisNumber.incr(key,default_increnment);
if(count==1){
redisCache.seeExpireTime(key,Expirem);
}
return count;
}
for(String msg:msgs){
long currentTime=System.currentTimeMillis();
currentTime +=Constant.MSG_EXPIRES_TIME_MILLIS;
Date date=new Date(currentTime);
long msgIdCount=redisCacheHelper.incr(msg.getKey(),date);
if(msgIdCount>1){
countinue;
}
}