无分页情况下的接口优化

发布时间 2023-12-13 10:08:53作者: superChong

一,功能背景

1,根据商家门店的历史营收,预测未来的营收

2,预测规则由用户设置,对部分或全部的数据求平均、最小值、中位数、指定不同范围数据的系数加权

3,规则地图由规则格子组成,门店-月份组成规则格子,比如superchong店,1-12月组成12个格子,当门店数量比较多的时候,如300家门店,规则地图会很大,且无分页,数据平铺。

4,规则取数范围较为复杂,可能跨店跨月份,比如superchong1门店-1月的规则,是取superchong1-100店的5-10月数据进行求平均。

二,方案设计

1,表:门店-规则关系表、规则表、门店-月份计算结果表

2,规则地图查询接口,查询门店-规则关系表关联规则表,同时获取历史营收数据,计算预估营收

3,用户点击确认方案,把数据落近门店-月份计算结果表

三,优化

规则地图查询接口

1,并行查询数据库

  规则地图关联、历史营收数据一次性获取数据比较大,数据量在3.5k条数据,数据库响应时间约700ms,同步获取时间叠加,选择用completableFuture,注意指定线程池,

在使用之前,用future.get(time)来保证获取到结果,也可以同countdownLatch阻塞。

2,较少字段的查询

  历史营收表中有10+个字段,规则地图使用的只有三个:门店-月份-营收值,获取全部字段要700ms,只获取三个字段,大约400ms

3,并行计算预估营收

  使用list.parallelstream,每一个格子并行计算,可以使用线程池执行,如completableFuture.supplyAsync(),经测试,线程池领先幅度不超过5%,使用并行流代码更为简介,所以采用了并行流的方式

4,效率测试

80%的场景是100家门店以下,总耗时约查库数据准备80ms+并行计算30ms=110ms

300家门店,总耗时约700ms+2.4s=3.1s,比优化前16s,下降了80%