物理网中往往会遇到某些设备疯狂的上报数据,而我们的服务端如果每个请求都处理,一是对服务性能要求比较高否则来不急处理,二是对我们的服务压力比较大,而且大部分上报的数据以及处理结果都是一样的。
因此,为了减少这种设备重复上报的场景对我们服务端的压力,我们基本都会增加请求的幂等处理。今天给大家分享一种非常简单的幂等处理方式:分布式锁幂等处理
通过RedissonClient,给消息处理模块增加分布式锁;在使用tryLock时设置等待时间为0,这样在服务端系统处理过程中上报的数据自动被忽略。这种方案只适用于大量重复上报且上报请求丢失不影响的场景。
// 获取分布式锁
RLock lock = redisson.getLock("myLock");
// 尝试加锁,等待0秒实现幂等,上锁以后10秒自动解锁
boolean isLocked = lock.tryLock(0, 10, TimeUnit.SECONDS);
try {
if (isLocked) {
// 这里执行需要处理的逻辑
} else {
// 加锁失败,记录日志
}
} finally {
// 确保锁最终被释放
lock.unlock();
}
如某设备100毫秒上报一次状态,即使本次上报不处理也不影响,因为100毫秒后会再次触发。