我正在处理的应用程序的一部分涉及下载包含附件的电子邮件,检测每个附件中的条形码,扫描它以查找标识符并使用该标识符将数据插入数据库。
到目前为止,我对消息总线的使用仅限于 Pub/Sub,而且我从来没有真正需要使用 Sagas。但是,鉴于上述每个步骤都是同一相关流程的一部分,并且我们希望在流程的任何部分失败时保持持久性,那么 Saga 是否合适?
我们的过程的详细信息以及我认为我们可以如何使用 Saga 如下:
- Quartz 作业用于下载包含 PDF 附件的电子邮件。Quartz 作业使用
Connector
包含有关Tenant
. Saga 将需要此租户信息,以便我们可以与租户特定资源(数据库/存储)进行交互。 - 对于每个 PDF 附件,我们启动一个“处理文档”Saga,将租户信息和文档本身(假设消息总线可以持久保存)或磁盘上文件的路径传递给它。为源电子邮件上的每个附件启动 Saga 后,连接器可以从邮箱中删除/存档电子邮件,以便不再处理它。
然后每个 Saga 将执行以下任务:
- 尝试从附件/文件中读取条形码。如果条码检测失败,我们需要将文件上传到指定位置,以便手动处理。这将完成 Saga。如果检测到条形码,我们将解码数据库标识符。
- 使用标识符,我们
Order
从数据库中加载相关记录,如果它存在:- 将文件上传到返回 URI 的指定位置
- 在我们的数据库中插入一条
OrderDocument
引用文件 URI 的新记录。
- 我们更新一个
OrderDocumentBundle
包含与订单相关的所有文档的单个文件。因此,当创建一个新的时,我们应该为相关OrderDocument
加载并附加新的页面。OrderDocumentBundle
Order
OrderDocument
- 传奇完成。
我担心最终捆绑过程中的并发问题,因为我们可能有多个消息试图更新捆绑包。我们需要确保 Saga 等待捆绑文件可用以完成。