日期:2026-07-11
标签:#面试 #八股 #后端 #Excel #性能优化 #场景题
一句话答案
将大导出改成异步任务,数据库游标分页读取、流式写 Excel、对象存储交付,并从查询、内存、序列化和网络四个环节分别优化。
面试口语版
先用指标确认慢在 SQL、数据转换、Excel 写入还是下载。小数据可以同步流式响应;大数据应提交异步导出任务,后台按主键游标分页查询,使用 EasyExcel 或 SXSSF 流式写临时文件,完成后上传对象存储并通知用户下载。查询只取必要字段、补索引,避免深分页和 N+1;写入时减少复杂样式、公式和自动列宽。任务要有进度、超时、取消、重试、文件过期和权限校验。
推荐流程
flowchart LR
U[用户提交导出] --> T[创建异步任务]
T --> Q[任务队列]
Q --> R[游标分页查询]
R --> W[流式写Excel]
W --> O[对象存储]
O --> N[通知下载]
关键细节
- 不要一次性把全部数据加载进 JVM,也不要用
offset做百万级深分页。 - Excel 单 Sheet 有行数上限,超大数据应拆 Sheet/文件,或直接提供 CSV。
- 保证一致性时要说明快照边界;长事务快照可能给数据库带来较大压力。
- 下载链接使用短期签名并绑定权限,导出内容可能包含敏感数据。
面试官追问
- 导出期间数据变化怎么办?
- 如何显示任务进度?
- 为什么 CSV 通常比 XLSX 快?
- 导出任务重复执行如何幂等?
面试官追问参考答案
1. 导出期间数据变化怎么办?
先明确一致性要求。普通报表可记录任务开始时间并按 updated_at <= snapshotTime 查询;强一致快照可使用数据库一致性读,但长事务代价高。更稳妥的是从数仓或带版本的数据快照导出,并在文件中标注数据截止时间。
2. 如何显示任务进度?
任务表记录状态、已处理行数、预计总行数、阶段和更新时间。Worker 每批提交后节流更新进度,客户端轮询或通过 SSE/WebSocket 获取;总数昂贵时展示阶段或近似进度,不能为了精确进度执行更慢的全表 count。
3. 为什么 CSV 通常比 XLSX 快?
CSV 是简单的顺序文本,几乎没有样式、共享字符串、XML 打包和压缩开销,可以真正流式写入。XLSX 是多个 XML 文件组成的压缩包,样式和对象模型更复杂;代价是 CSV 不支持多 Sheet、格式、公式且需处理编码和分隔符。
4. 导出任务重复执行如何幂等?
以用户、查询条件规范化哈希、数据快照版本和格式生成幂等键,相同任务进行中或有效期内直接返回已有 taskId/文件。状态更新使用条件更新,上传文件使用确定对象 Key 或版本,失败重试不能重复通知和泄露旧权限。
学习清单
- 掌握游标分页和流式写入。
- 能设计异步任务状态机和文件交付流程。