后端管理系统业务数据导出简单方案

174 阅读3分钟

背景

近期优化系统代码时,发现系统中存在许多导出文件的业务场景,并且存在以下问题:

  1. 各业务需求导出文件格式不同,有excel、pdf等;
  2. 各导出接口开发者各自编写文件写入、生成等逻辑,存在大量重复工作;
  3. 各导出接口都是同步接口,对于导出数据量较大或较复杂的业务,接口响应慢,前端无法感知导出进度,体验非常不好;
  4. 相同的数据集,每次都需要执行 查询+生成文件+下载文件 共3个步骤,无法满足多次前端一次查询多次下载的需求;
  5. 各接口生成相同类型文件使用不同底层工具库,没有统一;

基于以上原因,现需对文件导出业务场景进行优化,目标如下:

  1. 调整业务交互方式,由原本的前端调用接口后等待直至返回文件流,调整,拆分成 导出接口、导出进度通知前端、获取文件 3个步骤互不干扰;
  2. 对于导出的数据集,需要满足一次查询生成,多次下载的需求;
  3. 业务开发者只需关注获取导出的数据、文件内容排版,无需关注生成文件的过程;

方案

基于以上目标,简单设计如下整体方案,细节暂不考虑:

异步导出架构图.drawio.png

步骤如下:

  1. 前端调用业务导出接口;
  2. 创建导出任务到DB,发送导出条件到消息中间件,步骤1接口返回成功;
  3. 异步消费导出消息,调用步骤4、5获取导出目标数据并分批写入本地文件;
  4. 获取对应业务数据;
  5. 获取对应产物工厂;
  6. 本地文件上传到OSS;
  7. 数据导出到本地文件、上传本地文件到OSS过程中,更新DB导出任务进度与结果;
  8. 发送导出任务进度消息到webSocket服务;
  9. webSocket服务通知前端页面更新导出任务进度;
  10. 前端页面获取导出任务进度;
  11. 读取导出任务数据;
  12. 根据任务任务id获取OSS文件地址并下载;

优点

  1. 用户能感知导出进度,页面无需等待,一次导出可多次下载,体验感较好;
  2. 新业务接入简单,开发人员只需关注获取文件内容的逻辑与文件内容排版,减少大量的文件生成、上传、下载等其他逻辑,提高效率;
  3. 组件化维护,方便后续统一拓展,如导出文件内容国际化处理等。

缺点

  1. 前后端交互需要配合改造;
  2. 整体方案细节实现对开发人员编码要求较高;
  3. 涉及多种组件、中间件,交互复杂,故障点增加;

小结

本篇只对业务场景描述以及整体方案设计,不涉及具体细节实现。细看的话,还是能发现挺多问题的,如

  • 部分中间件不可用时如何处理?
  • 进度如何计算?
  • 导出数量超过本地存储空间大小如何处理?
  • 正在执行导出任务的机器突然挂了如何处理?
  • 其他问题。。

这些问题,本篇不做具体考虑,留到具体实现时再考虑。