【发布时间】:2020-10-16 15:55:51
【问题描述】:
我正在构建一个系统,以允许我们的客户将 PDF 银行对帐单(来自许多不同的银行)转换为更好的 CSV 格式(更好,因为它可以导入到会计应用程序中)。它会在 PDF 页面上查找表格并将其转换为 CSV 文件。
我将使用:
- 带有 HTML 表单的简单静态网页,用于上传 PDF 并选择要处理的银行。它还将显示作业状态并允许下载转换结果(CSV 文件)。它应该在没有用户身份验证的情况下运行。
- 在 NodeJS 上运行的后端(稍后会详细介绍)
- 神剑
- 傀儡师(操作神剑)
后端必须负责:
- 从 UI 接收请求(PDF 有效负载)
- 生成新的作业 ID
- 将其发送回 UI
- 为 UI 提供 HTTP 资源以询问作业状态
- 制作 Puppeteer 的新实例,将收到的 PDF 和作业 ID 传递给它
- 等待 Puppeteer 完成,接收存档文件(Excalibur 将表格的每一页放在单独的 CSV 文件中)
- 解压存档的 CSV 文件
- 使用转换器对其进行规范化(使用https://www.npmjs.com/package/mississippi 编写)
- 向 UI(客户端)发送响应
会出现的问题:
- 多租户 - 多个用户同时访问系统(我习惯于在一个用户会话的上下文中运行的 PHP,并且我知道 NodeJS 驻留在内存中,将使用 'continuation-local-存储'包)
- 通信 FEBE,处理大型 PDF 文件(需要大量时间)和向用户提供反馈存在挑战。这就是为什么我需要某种工作 ID 来识别客户。
- 禁用 Excalibur 数据库 - 我的解决方案不需要保存任何状态。
如您所见,有很多事情要做。我不想讨论决定(例如为什么要使用 Puppeteer 而不是直接访问 Excalibur API)。这是第一个粗略的版本。我有很多想法可以在以后改进这个系统。
我的问题是:我是否应该使用消息队列系统来简化(使其更具可读性)这个系统?该系统如何从使用 AMQP 或 Azure 队列之类的队列或仅将 MongoDB 作为队列中受益?使用消息队列时,这种系统的简单设计(框图)会是什么样子?我以前没有消息队列的经验,我从来没有使用过它们,但我觉得消息队列可以帮助我设计更好的系统结构。
【问题讨论】:
标签: javascript node.js pdf architecture software-design