异步 excel 导出组件设计和实现
2021-10-15 00:59:17 15 举报
异步 excel 导出组件设计和实现
作者其他创作
大纲/内容
大附件平台
2、将编码sid存入缓存队列中
依次出队
设计原则1、支持大数据量场景下的excel导出,采用异步导出方式;2、降低excel导出时的内存消耗。基于MyExcel,分批查询导入excel表中;3、后台封装公共导出方法,管理导出的整个生命周期。接入方只用关心业务逻辑,且代码复用性高;4、使用缓存队列,排队依次下载,使用自定义线程池异步处理,避免导出占用大量的服务器资源,影响业务接口正常响应;5、引入大附件平台。避免因导出文件过大、导出逻辑耗时过长带来的请求超时等的问题 ;设计思路1、为了适应不同的业务场景,前端还是调用不同的接口实现,而后端组件提供统一的excel导出服务,根据不同的域账号、查询条件、查询类型进行导出;2、后端组件包中提供通用异步导出方法。该方法封装查库、数据写入excel、excel文件上传、同步导出状态等逻辑3、后端组件中提供异步导出方法,该方法只做导出的批量管理,包括查询条件入库、放入缓存队列排序、excel文件上传、同步导出状态等逻辑,但不提供具体导出的业务逻辑;4、后端组件提供统一的获取导出excel文件下载地址的方法,支持异步下载导出文件 扩展点:1、后端组件包中可提供通用封装查库、数据写入excel的公共方法;2、查询导出状态可通过前端轮询方式查询,目前这种方案,数据库的压力会比较大,可采用将未导出的状态放入缓存中,同时通过webSocket长连接实现实时通讯;3、后端组建生成excel并上传大附件平台后,可邮件或其他方式通知下载人;4、可在通用导出服务中添加导出审计日志,记录重要敏感数据的导出情况,并且可以添加异常告警等扩展功能;消息队列的需求1.消息保序虽然消费者是异步处理消息,但是,消费者仍然需要按照生产者发送消息的顺序来处理消息,避免后发送的消息被先处理了。对于要求消息保序的场景来说,一旦出现这种消息被乱序处理的情况,就可能会导致业务逻辑被错误执行,从而给业务方造成损失。2.处理重复的消息消费者从消息队列读取消息时,有时会因为网络堵塞而出现消息重传的情况。此时,消费者可能会收到多条重复的消息。对于重复的消息,消费者如果多次处理的话,就可能造成一个业务逻辑被多次执行,如果业务逻辑正好是要修改数据,那就会出现数据被多次修改的问题了。3.保证消息可靠性消费者在处理消息的时候,还可能出现因为故障或宕机导致消息没有处理完成的情况。此时,消息队列需要能提供消息可靠性的保证,也就是说,当消费者重启后,可以重新读取消息再次进行处理,否则,就会出现消息漏处理的问题了。基于List实现消息保序解决方案List 本身就是按先进先出的顺序对数据进行存取的,所以,如果使用 List 作为消息队列保存消息的话,就已经能满足消息保序的需求了。处理重复的消息解决方案生产者提供一个消息id,消费者要把已经处理过的消息 ID 号记录下来。当收到一条消息后,消费者程序就可以对比收到的消息 ID 和记录的已处理过的消息 ID,来判断当前收到的消息有没有经过处理。如果已经处理过,那么,消费者程序就不再进行处理了。保证消息可靠性解决方案为了留存消息,List 类型提供了 BRPOPLPUSH 命令,这个命令的作用是让消费者程序从一个 List 中读取消息,同时,Redis 会把这个消息再插入到另一个 List(可以叫作备份 List)留存。这样一来,如果消费者程序读了消息但没能正常处理,等它重启后,就可以从备份 List 中重新读取消息并进行处理了。提高消费消息性能在生产者往 List 中写入数据时,List 并不会主动地通知消费者有新消息写入,如果消费者想要及时处理消息,就需要在程序中不停地调用 RPOP 命令(比如使用一个 while(1) 循环)。如果有新消息写入,RPOP 命令就会返回结果,否则,RPOP 命令返回空值,再继续循环。所以,即使没有新消息写入 List,消费者也要不停地调用 RPOP 命令,这就会导致消费者程序的 CPU 一直消耗在执行 RPOP 命令上,带来不必要的性能损失。为了解决这个问题,Redis 提供了 BRPOP 命令。BRPOP 命令也称为阻塞式读取,客户端在没有读到队列数据时,自动阻塞,直到有新的数据写入队列,再开始读取新数据。和消费者程序自己不停地调用 RPOP 命令相比,这种方式能节省 CPU 开销。
3、定时查询缓存队列,如果缓存队列中存在数据,则取出编码sid,状态->导出中
数据库
7、根据域账号查询附件下载地址;
入库
5、获取导出地址
查询状态
5、excel文件上传到大附件平台,返回url地址
6、如成功后则数据库状态->已完成;如失败则重新放入缓存队列中,重试一次
返回文件地址
请求转发
异步 excel 导出组件设计和实现
2、业务导出接口
后台服务
3、统一导出服务
1、条件限制
缓存服务器
返回导出状态
4、统一导出查询接口
1、将域账号、查询条件、查询类型存入数据库并生成唯一编码sid,状态->准备中
上传excel文件
后端组件
4、通过编码sid获取查询条件和查询类型,分页查询数据,生成excel文件
依次入队
返回成功
前端接口

收藏
0 条评论
下一页