查询引擎优化方案

现状

  • 每分钟去查N次数据库,每一次都会扫描几千行,其中N=通道的数量。
  • 查的非常频繁,但线上状态为I或E的交易很少很少,有一种杀鸡用牛刀的感觉。
  • 第一次查询时间区间太大(30s~90s之间)。
  • 查询高峰堆在一个时间点上,不均衡。
  • 每分钟启动一个线程,但一此只能启动一个线程。

优化后

  • 不用查数据库。
  • 只处理状态为I或E的交易。
  • 每次查询时间的区间可以精确到秒, 粒度可自由调控。
  • 均衡分布。
  • 可以使用线程池,可以N个线程协同处理。

具体步骤

创建一个数组task[List],一个时钟线程Thread-timer,长度为12,每5秒走一步,如下图:

task-arr.png

如果有状态为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。