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 }

 

posted @ 2021-12-04 16:01  sellingpear  阅读(845)  评论(0)    收藏  举报