场景: 每个月跑完结算数据,生成各个供货商的结算报表数据
前置条件:一份离线报表的生成 受供货商订单的数量影响 ,时间在 5秒~30秒,尤其在购物节或者有推广活动时,时间还会增加
一份报表的生成 需要包括 订单信息,结算数据,商品信息,发货信息。
第一版:查询所有供货商 。循环生成报表,(无疑是有问题的)
第二版:
1.经过分析发现,其实每份报表的独立性是很高的,天生就适合多线程并发运行,我们把数据收集 和 报表生成分拆成两个步骤,我们采用了生产者消费者模式,首先将所有供应商生成报表任务放入一个队列有一组线程去处理,当完成收据收集后,加入到另外一个生成报表的队列 因为每个供货商报表数据收集完成的时间并一致,采用CompletionService作为线程池,先执行完的先返回,并不受加入顺序影响
2.对于爆款商品 在供货商之间重复很高,为了避免重复性查询。肯定要使用缓存机制,无意Map是最适合的根据商品id拿到商品详情,考虑并发安全使用ConcurrentHashap,首先从缓存取,取不到再去查一次,
3.由于一个订单包含多个商品,一个用户可以重复购买,最后使用三个个MAP,一个缓存商品,一个缓存订单,一个缓存用户
第三版:
1.考虑到Map类型对内存的使用率低,一般只有20%-40%,ConcurrentHashap会更低,每次动辄几千商品信息放在map 要占用几百M的内存。为了限制Map的大小改用了ConcurrentLinkedHashMap,他本身是对ConcurrentHashap的封装,可以设定最大长度,并实现了基于LRU最少使用算法策略进行数据更新的缓存,对于冷门的商品在容量满了以后可以从缓存中去掉,提高内存利用率
2.对线程池参数的调整
记录 对供货商财务报表的导出的优化
于 2020-04-25 23:04:36 首次发布