关于分布式程序从DB获取唯一资源的思考

场景:

DB的A表中已经有了资源,但是还没有被分配。有水平扩展的3个服务(srv1、srv2、srv3),都会去A表中查询可用的资源,然后更新其状态,但是这个时候如果更新的资源相同,就可能出现阻塞或者获取资源失败的情况,如果在大并发下能够获得更好的支持呢?

想到了2个解决办法:

方法一:

思路:先查询出一定的可用资源,然后选取其中的一条进行更新

1、先根据业务条件在A表进行查询,然后选出1000条可用的资源ID

2、从面随机选中一条,然后在A表进行update(update的时候采用CAS策略(即set and compare))

方法二:

思路:先生成一个 UUID,然后将业务数据以及UUID更新到A表,然后根据UUID查询出这条数据

1、先在程序中生成一个UUID

2、将UUID和业务数据更新到A表中(1、在更新A表的数据时,也是从一个内嵌的集合中随机选取一条,减少碰撞的概率;2、update的时候采用CAS策略(即set and compare)

总结:

1、以上操作在一个专门的AOP方法中进行,否则事务提交会慢,阻塞的时间会变长

2、以上方法虽然还是有几率发生阻塞碰撞,但是已经能够在大并发的时候进行高效的处理,失败率也可控制,满足设计要求。

如果大家有更好的办法,欢迎讨论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值