前言:
虽然早已入坑,但也是现在才想起来在这个平台分享自己一些项目中遇到的问题及其解决方案,
做项目,肯定由简入繁,尤其对于创业团队,时间紧张,采用快速开发的思路,也要注重可扩展性、可持续性、
可维护性,而对于此项目的延展,也要有长期的规划与调整
更新不求多快,只求问心无愧
正题
问题:项目中总会遇到的导出问题
分析:一般想的话都会去使用一些开源的框架去简化操作,比如阿里的easyExcel、easypoi等等,
这里不详细介绍(个人推荐前者),数据量小的话,一般直接用就好了,但是一般项目随着时间的推移,数据量的不断增加,导致导出会出现瓶颈,超时情况会时而出现,当然对系统压力也不小
解决方案:
一、业务维度
1、如果真实业务不需要导出那么多数据,那可以优化成只给查一段时间的数据(当然越小越好),
或者作为根本解决这个问题的一个过渡;
2、根据业务形态,简化导出的列(主要能帮忙减少数据库查询复杂度),当然查询条件也可以优化,
可以适度减少不必要的条件,查询时原来用的text,现在用下拉或者radio,
即 将原本需要模糊查询的改成=(这样肯定可以走索引)。
二、技术维度
1、同步改异步:由于数据量过大,同步导出可能直接超时,导致导不出来,所以用异步导出可以解决,
具体:创建一个合适的线程池,线程数就用cpu核数,其他参数酌情修改,后端接收请求,将其打包
成任务传给线程池处理,处理完后记得将文件上传至FTP服务器,并且将下载链接记录到导出记录表中,
最终用户直接去导出记录菜单里查询自己的导出记录即可(导出记录表需记录导出表名、导出条件,执行时间、
导出时间、url等等,当然有条件的导出完可以发个短信给导出人);
注:由于可能存在多个用户一起导出,所以可以做成消息队列,排队限制同时导出,具体实现可选择合适MQ
2、归档要导出的表:通常单表数据量超过一定阈值,会出现查询性能问题,因此,
可以将单表按照某个维度进行归档处理(通常按照时间维度,按月归档),这样在查询时单表数据量
总能控制在个合理范围,不至于查询过慢(当然要注意跨月问题);
3、采取大数据方式管理:由于数据量越来越大,归档可能也不一定满足最终导出,所以
新的解决方案来了,可以用ES+Hbase(运维能力要求高,低的可用clickhouse)实现大数据的存储及快速查询
此方法可以从根本上同时解决数据存储及查询性能问题。
总结:
导出不简单,做得好更不简单,我这里只提及了一些我项目的真实经历,可能还有漏掉的,或者不完善的,或者不够全面的,希望可以留言探讨