RocketMQ结合Redis实现消息去重
在保证了rocketMQ的消息顺序性之后,还应该进行消息去重。
由于消息的重复性往往是由于网络抖动造成的,所以我们一般要在自己的业务端完成消息的去重。
一个可用的方案就是使用Redis做缓存。
具体方案如下:
1.消费端收到消息的时候,使用Redis提供的incr,以msgID作为key(保证唯一性),value默认从1开始递增;
2.当incr返回值为1的时候,设置其失效时间为2分钟,并且要注意,该消息需要被消费;
3.当incr返回值大于1 的时候,忽略该消息。
代码如下:
1 public long incr (Strint key, Date ExpireTime){ 2 long count = redisNumber.incr( key, DEFAULT_INCREMENT); 3 if ( 1 == count){ 4 redisCache.setExpireTime(key, ExpireTime); 5 } 6 return count; 7 }
1 for(MessageExt msg : msgs){ 2 //判断是否用重复消息,缓存2分钟后失效 3 long currentTime = System.currentTimeMills(); 4 currentTime += Contants.Msg_EXPIRES_TIME_MILLIS; 5 Date ExpireTime = new Date( currentTime); 6 long msgIdCount = redisCacheHelper.incr(msg.getKeys(), ExpireTime); 7 if( msgIdCount > 1){ 8 continue; 9 } 10 }

浙公网安备 33010602011771号