我也想了一个循环流水号实现,同时考虑集群环境与高并发

第一次发帖,发现还需要做一个发帖小测试,满有意思的!好了进入正题!
刚才看http://www.iteye.com/topic/1114846 做了一个循环流水号的实现,实际上我最近也遇到的关于流水号的需求,觉得他的实现太过于简单.这里说说我的实现想法,请大家点评,欢迎拍砖!

首先: 流水号通常是唯一的如果重启后如何保证流程号的连续性.
其次: 没有考虑集群环境,在多机部署的情况下没有同步流水号会出来流水号重复现象.
再次: 高并发访问,既是我们通过数据库来记录流程号,如用Oracle的sequence频繁的数据访问会造出很大的IO效率问题,同时事务问题也不好控制.

这里我就想了一个实现是这样的.
首要解决的事高并发和重启后保证流水号不连续性问题.
我们在数据库中存放流水号的生成规则如(流水号格式,流水号缓存大小,流水号重置规则),以及当前流水号的最大值.
采用单实例每一类流水号生成唯一的流水号提供服务类.按照流水号缓存大小一次性加载需要缓存的流水号到内存中.
仅当消费的流水号超过了内存中最大的缓存数时,才向数据库中写入前流水号的最大值.并且再次一次性生成缓存值大小的流水号到内存中或者当服务器关闭时也写入写入前流水号的最大值.
这样做的目的仅仅是解决了高并发访问效率问题,减少了数据读写的操作,如当我设置缓存值为500时,只有当缓存中所有的流水都被消费完了,才会一次性再向数据库申请500个流水号.

但是这样做还不能解决集群问题,由于集群下每个JVM虚拟机拥有自己独立的实例,那么单实例每一类流水号生成唯一的流水号提供服务类互相之间还要解决同步问题,可以通用ehcache的集群同步机制, 将流水号服务类交给ehcache管理.
保证在各个集群下不同JVM拥有相同的流水号提供服务类.解决流水号重复现象.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值