现状
- 每分钟去查N次数据库,每一次都会扫描几千行,其中N=通道的数量。
- 查的非常频繁,但线上状态为I或E的交易很少很少,有一种杀鸡用牛刀的感觉。
- 第一次查询时间区间太大(30s~90s之间)。
- 查询高峰堆在一个时间点上,不均衡。
- 每分钟启动一个线程,但一此只能启动一个线程。
优化后
- 不用查数据库。
- 只处理状态为I或E的交易。
- 每次查询时间的区间可以精确到秒, 粒度可自由调控。
- 均衡分布。
- 可以使用线程池,可以N个线程协同处理。
具体步骤
创建一个数组task[List]
,一个时钟线程Thread-timer,长度为12,每5秒走一步,如下图:
如果有状态为I或E的交易,就把BankCommand放入task[current_index + 6]的list中【此处有并发问题,加锁即可解决,后面讨论】,并把他的loop_count
标记为0。
6 * 5s=30s之后,时钟走到刚刚上面那个交易存放的位置,另起线程取出List中loop_count等于0的交易之后去查询,再更新beCommand表,并把此list中所有交易的loop_count减1,然后清除list中loop_count小于0的交易。【另起线程时可以使用线程池】
如果某银行通道的查询需要延迟3分钟后才查询,只需要在放入task中的时候,让loop_count等于3。