ActiveMq的顺序性消费问题怎么解决

发布时间:2021-12-30 09:47:15 作者:iii
来源:亿速云 阅读:143

这篇文章主要讲解了“ActiveMq的顺序性消费问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ActiveMq的顺序性消费问题怎么解决”吧!

    业务的ABA问题

业务1将数据A从缓存中取到,业务B将数据A从缓存中取到并将A变成了B,然后又将B变成了A,业务1发现此时数据仍是A,A操作成功,尽管业务操作时成功的,但不代表整个过程就没问题。另外,虽然顺序性问题有可能带来的结果是一致的,但是不代表这个过程中影响的其他数据就没问题。

ActiveMq的顺序性消费问题怎么解决

如图,同一时刻库中存入相同数据6条,但严谨逻辑只能允许库中存在相同数据只有一条,如果此时其他业务查询相关数据,必定会出现多结果返回

     设想解决方案一:原子计数

     方案:在每条数据进行操作之前,先判断两次操作数据是否为同一个,即redis的kv为同一个,如果相同则此时对key进行标记incr,步进1,在mq进行消费时,从redis中取出此key的步进值与传进来的步进值比较,按理说只需要记录想用kv值得最后最大步进值得操作

 Long incr = redisService.incr(key,1); Object o = redisService.getIncrValue("key"); if(o.toString().equals(vo.getIncr())){       //业务逻辑      }

结果测试:同样会出现此问题。一开始想到当前页面为同一用户对同一信息的操作,不会出现或者点不出如此高的并发,那不考虑接口被恶意攻击的情况,使用jemeter进行动态传参结果如何呢?

ActiveMq的顺序性消费问题怎么解决

每次的参数入参读取文件值,使每次结果为不同的操作,或者两台机器为同一账户对同一信息进行操作,必定会产生网络延迟造成对结果不一致的问题。

   设想解决方案二:分布式锁

   方案:对当前操作进行加锁,并保证同一值得锁操作为同一把锁时进行业务处理,集群模式下对消息进行分组,具体方案不成熟,引入redisson处理,但也疑问为了保证顺序性问题引入分布式锁的成本与性能问题,最终没能达到理想结果。

public Boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {        RLock lock = redissonClient.getLock(lockKey);        try {            return lock.tryLock(waitTime,unit);        } catch (Exception e) {           return  false;        }    }

感谢各位的阅读,以上就是“ActiveMq的顺序性消费问题怎么解决”的内容了,经过本文的学习后,相信大家对ActiveMq的顺序性消费问题怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. vue 解决遍历对象显示的顺序不对问题
  2. spring-kafka多线程顺序消费

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

activemq

上一篇:MyBatis与MycatDao如何实现外键查询

下一篇:IdentityServer4的理论分析是怎样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》