关于分布式程序从DB获取唯一资源的思考
2018-01-24 17:20
190 查看
场景:
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、以上方法虽然还是有几率发生阻塞碰撞,但是已经能够在大并发的时候进行高效的处理,失败率也可控制,满足设计要求。
如果大家有更好的办法,欢迎讨论
相关文章推荐
- 关于前两天的一个比较复杂的程序逻辑的思考
- AfxGetResourceHandle用于获取当前资源模块句柄,而AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄。
- 关于Spring工具类获取classpath下的文件资源
- 缓存,用户信息不能随便修改的,因为这里面的id是唯一的身份标识,获取资源全靠他了,
- android获取设备唯一标识完美解决方案的思考以及实现方式
- linux关于readlink函数获取运行路径的小程序
- 程序思考2: 关于“框架”
- 关于buffer overflow detected 程序崩溃的思考
- 一段关于从HTML文件找出资源地址的小程序(不断更新)
- 关于程序进入包含EditText控件的界面会自动获取焦点并弹出软键盘影响用户体验的问题
- 关于程序Exception抛出异常和利用返回值去做判断的思考
- 关于“COM+ 无法与 Microsoft 分布式事务协调程序交谈
- 由小程序引起的思考----关于字段和方法的分派
- 关于程序高内聚低耦合的思考
- 关于程序人生的些许思考...
- WPF 获取绑定的事件处理程序绑定全局资源
- 关于指令、数据、程序和进程的一些思考
- linux关于readlink函数获取运行路径的小程序
- C++:在程序中获取全球唯一标识号(GUID或UUID)
- 关于xcode工程中添加资源文件程序找不到的问题