一,功能背景
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%