RocketMQ幂等消费
前言
我们在使用RocketMQ的时候,有时候需要对消费端做幂等处理,防止重复消费,作者在项目中用的最多的就是redis的分布式锁,特别是在高并发下,消费端的幂等处理显得尤为重要。
一、分布式唯一id?
如果项目中有用到分布式唯一id的话,就很简单,直接对该id做redis分布式锁处理,如果没有的话,则需要选用全局唯一的属性比如订单id,支付流水号等类似的能够保证全局唯一性,也可以自己用CurrentTraceContext类的spanId或者UUID.randomUUID()方法等自定义生成唯一id,之后在消费端就可以用redis的分布式锁保证幂等性了。
二、使用步骤
1.寻找uuid
自己业务场景中如果有全局唯一id的话,可以直接用,如果没有的话,可以自己生成,以下是两种id生成方式:
利用UUID.randomUUID()方法生成uuid;
String uuid = UUID.randomUUID().toString().replace("-", "")
或者利用CurrentTraceContext类的spanId生成唯一id
@Autowired
private CurrentTraceContext traceContext;
String uuid = HexCodec.toLowerHex(traceContext.get().spanId());
2.redis分布式锁
可以用原生的redission,也可以自己封装一层,或者直接用公司封装好的redis包,
将redis key 前缀加上相应的uuid作为key:
<T> boolean setNX(String key, T value);
value可以随意设置一个值,如果想要设置过期时间的话,可以多加一个参数timeMills(毫秒):
<T> boolean setNX(String key, T value, long timeMills);
或者用
long incr(String key, long timeMills);
每次mq消费的时候,可以调用一次incr方法,判断最终返回的值是否等于1,也可以判断是否重复消费处理
总结
以上就是利用redis做mq的消费幂等处理,也可以采用其它的方式,具体得根据业务场景来考虑,希望以上内容可以帮助到你!!!