遇到的问题:
生产上销售经理批量审批线索的时候接口非常慢并且偶尔服务器会挂掉
解决思路:
首先审批只改了线索的状态,线索表有几百万数据,初步怀疑是表数据量大引起的,但是更新表并不会太慢,而且也不会把服务器压垮
分析代码找出问题:
带着问题分析代码,一步一步执行!发现问题在审批通过的时候,会把当前线索的信息作为参数调用其他系统开始建卡!首先在这里增加日志,这边分为两步,根据线索id查询线索信息,线索信息调用其他系统建卡!首先查询耗时0.5秒左右,由于这里是批量操作,在调用其他系统的时候会经常出现连接timeOut的原因,本地数据库连接和调用服务连接都未释放,这也是之前服务器挂掉的原因
解决问题:
首先建一张表,保存线索id和线索状态,把调用其他系统建卡操作修改为保存本地记录表。在用定时任务消费这张表,查询线索信息并调用其他系统进行建卡,根据返回参数修改线索的状态!
方案复盘:
为什么不用消息队列?
1.首先如果用消息队列需要查询出线索的信息,这一步也是耗时的,虽然后来发现是从表没有加索引导致查询耗时,但把这一步抽出来避免了查询的时间.
2.消息队列不能获取线索处理状态,使用定时任务可以保证线索处理失败继续处理
3.把建卡这一步抽取出来完全解决了服务器压力问题,定时任务是单独的服务器和应用服务器隔离的,在使用定时任务可以保证单线程执行
在次踩坑:
线索审批会出现重复操作,我们是在页面上操作的!只要不刷新页面就能重复审批。这样线索任务表会有重复数据,建卡就有重复数据!
解决方案:
采用redis分布式锁,把线索id作为key锁住整个操作(查询数据库,没有插入,有就不操作)