Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. 架构方案
  3. 正文
                           

【转载】系统设计 | 导入和导出

2023-11-05 1540点热度 0人点赞 0条评论

系统设计 | 导入和导出


在项目上我们经常会遇到一些导入导出的场景,常见的有 Excel 的导入导出,以及 PDF 的导出。

这一期的技术方案总结一下相关的技术方案和实现。

Excel 的导出和导入

我们先放开脑洞枚举一下有哪些导入导出的方案。

Excel 的导出方案有:

  1. 前端导出,直接在前端导出所有的数据,甚至后端可以复用分页的查询数据接口。
  2. 由具体的领域微服务实现同步导出。
  3. 由 BFF 通过领域微服务的接口实现同步导出。
  4. 由单独的导出微服务实现导出 API,并通过事件传递到领域微服务,实现异步导出。
  5. 由具体的领域微服务实现同步导出,但是可以将其上传到文件服务服务器,并异步下载。

以前来说方案 1 是一个脑洞,不过在浏览器发展到今天,SheetJS、xlsx-style 等开源项目完全能实现相关需求。由前端来处理数据并导出可以分散服务器压力到客户端,并且实现成本更低。在条件满足的情况下,可以考虑直接使用方案 1。

方案 3 的缺点是如果让 BFF 来处理导出的工作会破坏领域服务的端到端交付能力,业务不够内聚,团队工作划分问题也不太好处理;方案 5 会将问题变得复杂,并且没有带来收益。

所以如果方案 1 不满足的情况下,我们许多项目不需要异步导出的场景下直接使用方案 3;而在有异步导出需求的情况下使用方案 5。

类似地同样的,Excel 的导入方案有下面几个,不过会有一点点差异:

  1. 前端导入,通过前端解析 Excel 并通过批量新增接口传送到后端。
  2. 由具体的领域微服务实现同步导入,领域微服务直接解析导入的文件。
  3. 由 BFF 解析文件后,再调用后端的领域微服务,批量插入或者更新数据。
  4. 由单独的导入微服务实现导入 API,负责处理文件,并通过事件传递到领域微服务,实现异步导入。
  5. 前端先把文件上传到文件服务器,获取到文件 ID 后,通过文件 ID 直接和领域微服务交互实现导入。

导入方案对于导出方案来说会有一点不同,导入的附件数据往往有时候需要在服务之间、外部系统之间传递,所以即使是同步导入我们也可能会考虑先把文件上传到资源服务器,再由前端把文件 ID 发送到需要的领域服务处理后续业务,这样更容易处理附件,即方案 5。

而对于异步导入来说,推荐方案 4,通过事件的方式由单独的微服务来处理导入问题(往往是一个单独的导入导出微服务,或者是通用的基础服务实现),甚至可以实现进度条功能(HTTP 协议允许不断往客户端发送进度信息,不过很多时候会做一个假的进度条)。

异步导入导出方案可以参考下图:

系统设计 | 导入和导出

PDF 导出

对于 PDF 导入导出来说,PDF 导入识别的场景比较少,而 PDF 导出的场景非常多。

往往有几种思路:

  1. 直接使用前端的 PDF 库,可以通过绘图的方式生成 PDF,也可以将 HTML 文档渲染成为 PDF。
  2. 使用 Java 的 Apache poi 等项目在后端实现。
  3. 使用一个单独的服务来实现,例如使用无头浏览器 Puppeteer 做浏览器页面快照。

这三种方案各有适合的场景:

  1. 方案 1 适合一些简单的场景,复杂的场景非常容易让浏览器崩溃(Crash)。
  2. 方案 2 适合单据生成,可以使用一些模板文件生成 PDF,这类 PDF 布局往往比较简单。缺点是排版上没有那么灵活,开发起来也不太方便,往往后端开发人员不熟悉界面开发相关的技巧。
  3. 方案 3 可以做到不对业务造成侵入,适合一些复杂的排版、页面渲染场景,缺点是资源消耗大和性能比较差,毕竟启动和运行浏览器的开销比较大。

整体来说如果是业务系统尽量采用方案 2,在用户体验、性能开销、维护性上比较中庸,但相对保守;从开发成本上来说,其余两个方案优势明显,近年来越来越多的项目开始采用统一的 PDF 生成服务为众多的场景提供 PDF 生成能力。

参考资料

[1] Generate a PDF with JavaScript https://medium.com/coderbyte/generate-a-pdf-with-javascript-3e53ca7b47e

[2] https://github.com/parallax/jsPDF

[3] Webinar http://shaogefenhao.com/libs/webinar-notes/java-solution-webinar-8.html

-END-


文 | 少个分号 (转载请注明出处)

关注公众号:DDD和微服务

微信号:shaogefenhao

同名知乎:少个分号

本文仅供学习!所有权归属原作者。侵删!文章来源: DDD和微服务 -shaogefenhao :http://mp.weixin.qq.com/s?__biz=MzA4Mzc2MzcyMQ==&mid=2247484728&idx=1&sn=3097df301ce7dd12a96e99dc1291f183&chksm=9ff0325ea887bb48563c4b7c9766d8c941e1cf98f345355083d87716f429910992c9eb9df922&scene=21#wechat_redirect

更多文章:

  1. 系统设计 | “胖瘦” BFF:常见的两种微服务形态
  2. 系统设计 | 企业应用数据交换
  3. 系统设计 | 哪些技术标准可以帮助系统设计?
  4. Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!
  5. 系统设计 | 业务编号生成
  6. 系统设计 | 如何表达技术架构?(规划篇)
  7. 系统设计 | UUID 和 自增 ID 怎么选?
  8. 系统设计 | 应用系统缓存
  9. 系统设计 | 高性价比的测试策略("瓜藤"比喻)
  10. 系统设计 | 基于读者反馈的补充更新 (1)
标签: 转载 系统设计 数据导入 数据导出 方案设计 Excel
最后更新:2023-11-05

coder

分享干货文章,学习先进经验。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
文章目录
  • Excel 的导出和导入
  • PDF 导出
  • 参考资料
最新 热点 推荐
最新 热点 推荐
Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代 视频笔记-微服务架构P4:必懂5种设计模式 视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务?
基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性视频笔记-微服务架构P4:必懂5种设计模式Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代
一次误删除MySQL主库的恢复操作 记一次网络请求连接超时的事故 解构领域驱动设计(二):分层架构 Netflix 技术栈 Log4j框架疯狂写日志,导致磁盘打满问题排查 系统设计 | 系统设计中需要考虑到的时间问题 京东平台研发朱志国:领域驱动设计(DDD)理论启示 ParNew+CMS 实践案例 (一)- NameNode YGC诊断优化

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (20) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2