常见问题处理方案
- 数据报表Excel导出很慢的优化方案
- 接口重复请求的幂等问题解决方案
数据报表Excel导出很慢的优化方案
先排查出到底是哪里慢,是数据库查询慢,业务循环处理慢,还是excel导出慢
如果是数据库查询慢,就需要注意不能一次性将所有数据查询出来,需要分批次查询,并且尽量使用游标分页模式,不要使用 limit 方法,会存在深分页性能瓶颈,还需要做好数据索引的优化。
业务循环慢,这个只能优化处理逻辑,尽量批量处理,减少循环次数等。
excel导出慢,可以使用easyexcel组件默认的流式写入更省内存,数据量很大时,可以通过多线程并发处理写多个excel文档,例如一个线程去查询2025年数据并写到2025文档,另一个线程去查询2024年数据并写入到2024年文档。
最后,如果需要导出的数据不是实时的,而是历史数据,并且导出功能使用频繁,可以在设计层面做好预处理,例如今年1月1号凌晨,就在后台打包好去年的历史数据,然后白天用户可以直接下载,不用再去即时的查库生成文档了,当然这个只适用于部分场景,具体还需要根据时间情况设计。
接口重复请求的幂等问题怎么解决
用户点击提交请求后,前端将按钮置灰禁用一定时间,防止重复点击按钮发起请求。
还可以在后端服务添加自定义注解,和AOP切面,拦截校验有需要的api请求,校验IP地址、请求参数、请求uri,如果在一定时间范围内一致,则表示是重复请求的,直接拦截并返回提示信息。
提交表单数据前,前端事先先请求后端获取到一个token令牌,这个token后端会临时存储在redis里。
前端在提交表单时,携带token,后端接收到请求时,先校验token是否存在于redis,存在则正常处理提交逻辑,结束后删除token。如果不存在,则代表已经处理过,返回提示信息给前端。
对于高并发场景的需求,还可以使用分布式锁,直接使用redis和redisson,redisson已经实现好了分布式锁的自动续期,和超时释放等功能,还有现成的读写锁。
对于新增场景,可以给数据表添加唯一索引,可以进行最后一道数据唯一性校验,但是存在个问题,如果是分表场景,无法进行有效校验,对此可以在新增前添加唯一性数据查询校验步骤,需要注意,添加次操作会对接口性能造成一定影响。
对于更新场景,可以使用乐观锁机制,给数据表添加version列,更新时除了需要比对主键id,还需要比对version,如果version对应不上,则说明数据已经被其他线程更新过,不能再继续更新,可重新获取数据进行更新尝试,或直接提示信息给前端。
对于存在状态流转的业务例如运输,从已发货 --> 已收货,如果更新时状态无法匹配预期状态,则拒绝更新。
具体可以根据可以根据实际业务场景进行灵活组合搭配。
