背景
随着业务发展,系统中使用文件导入导出的功能越来越多,针对每一次导入导出功能的添加,开发同事都需要重新进行一次大量重复且可能不安全的文件操作,并且常常伴有如下问题存在:
- exce样式问题导致oom
- 并发执行时oom
- 开发水平参差不齐导致线上问题
- …..
由此,急需一套平台级的文件上传下载中心服务来解决上述的诸多问题
设计思路
将导入导出具体操作异步化,即文件中心统一保存用户请求(导出的请求参数/导入的文件)后,逐条顺序执行。
同步导入导出
流程
异步导入导出
时序图
导出
导入
以excel导入为例
表结构
涉及两张表
- 批次表
- 模版表
批次表
字段 | 定义 |
---|---|
用户唯一识别号(userId) | |
批次号 | |
模版号 | |
类型(in/out) 导入导出 | |
处理状态(排队/处理中/正常结束/异常结束) | |
异常原因 | |
in_source_url 导入原文件 | |
in_csv_url 导入转CSV文件 | |
our_url 导出文件 | |
创建时间 | |
开始处理时间 | |
处理完成时间 | |
… |
模版表
字段 | 定义 |
---|---|
模版号 | |
落地服务 | |
限定行数 | |
类型(in/out) 导入导出 | |
允许部分执行 | |
out模版地址 |
平台缺点
1.交互
交互环节相比同步操作更加复杂
2.处理速度
相比于同步操作,文件中心由于是排队顺序执行,在导入导出操作频繁且业务分散在不同的系统中时,时间上会远超同步操作时间。
3.服务对接
存在导入导出功能的服务,需要引入文件中心依赖接口,并泛化实现
隐患解说
1.基于dubbo rpc方式调用,文件中心对服务间的每次请求,如果时间长,则会夯住占用一个线程,但是由于是顺序执行,因此最多也只会占用一个线程。