【发布时间】:2013-05-20 01:13:43
【问题描述】:
我正在处理的应用程序的一部分涉及下载包含附件的电子邮件、检测每个附件中的条形码、扫描它以查找标识符并使用该标识符将数据插入数据库。
到目前为止,我对消息总线的使用仅限于 Pub/Sub,而且我从来没有真正需要使用 Sagas。但是,鉴于上述每个步骤都是同一相关流程的一部分,并且我们希望在流程的任何部分失败时保持持久性,那么 Saga 是否合适?
我们的过程的详细信息以及我认为我们可以使用 Saga 的方式如下:
- Quartz 作业用于下载包含 PDF 附件的电子邮件。 Quartz 作业使用
Connector,其中包含有关Tenant的信息。 Saga 将需要此租户信息,以便我们可以与租户特定资源(数据库/存储)进行交互。 - 对于每个 PDF 附件,我们都会启动一个“处理文档”Saga,将租户信息和文档本身(假设消息总线可以持久保存)或磁盘上文件的路径传递给它。为源电子邮件上的每个附件启动 Saga 后,连接器可以从邮箱中删除/存档电子邮件,以便不再处理它。
然后每个 Saga 将执行以下任务:
- 尝试从附件/文件中读取条形码。如果条码检测失败,我们需要将文件上传到指定位置,以便手动处理。这将完成 Saga。如果检测到条形码,我们会解码数据库标识符。
- 使用标识符我们从我们的数据库中加载相关的
Order记录,如果它存在:- 将文件上传到返回 URI 的指定位置
- 在我们的数据库中插入一条新的
OrderDocument记录,该记录引用文件 URI。
- 我们更新了
OrderDocumentBundle,它是一个包含与订单相关联的所有文档的单个文件。因此,当创建一个新的OrderDocument时,我们应该为相关的Order加载OrderDocumentBundle并附加来自新OrderDocument的页面。 - 传奇完成。
我担心最终捆绑过程中的并发问题,因为我们可能有多个消息尝试更新捆绑包。我们需要确保 Saga 等待捆绑文件可用以便完成。
【问题讨论】:
-
有什么问题? “佐贺是个好选择吗?”没有建设性。
-
我已经解释了我们的流程。我想知道 Saga 是否是最好的方法。
-
如果你只是使用一个简单的作业调度,如果你选择使用“NServiceBus saga”,也许你甚至不会使用Quartz,但你只是帮自己一个忙,使用saga时,永远不要发布事件。
标签: soa nservicebus messaging saga