我是 nservice 总线的新手,正在尝试学习这些概念。
我正在尝试创建一个应用程序,该应用程序会在从客户那里收取一些款项后注册客户。注册过程中有几个第三方集成,例如 Payment 和 ExternalXYZ 等
我正在考虑执行以下步骤
- 从 MVC 控制器调用 WebAPI 层,它将发送一个使用 NService 总线注册客户的命令,例如 BeginRegistrationProcess
- BeginRegistrationProcess 将生成一个关联 ID,创建一个 DB 条目并通过另一个命令(例如 ProcessRegistration)启动一个 Saga
ProcessRegistration 将做以下事情
- 创建一个 Db 条目
- 调用支付服务(通过 DoPayment 命令 - 这将包括创建数据库条目、拨打电话、处理响应等步骤)
- 调用 ExternalXYZ Web 服务(通过 CallExternalXYZ 命令——与 DoPayment 中类似的步骤)
我正在考虑为这两个服务调用创建两个单独的命令,以便它们在自己的小事务范围内。这些命令将在进行服务调用之前和之后记录详细信息。(如果服务调用失败并且我需要重试它们,这可能有助于补偿逻辑)
这是我的问题
- 这听起来不错吗?
- 我将如何处理错误情况。例如,说第 3 步的 DB 条目已完成,然后在付款时发生超时(可能是卡被借记并且在发布回复时发生超时,或者可能是网络超时)。我将如何确保该卡不会被借记两次。
- 如果 DoPayment 处理程序中出现错误,nservicebus 将回滚 ProcessRegistration 传奇中的事务
- 如果出现错误,我在调用服务之前从 DoPayment 进行的任何数据库调用会发生什么。
是否有任何示例显示如何在 sagas 中处理补偿。我热衷于创建一个可由 ProcessRegistration 启动的补偿传奇,我可以利用日志表(该表有每个服务调用之前/之后的记录)来启动补偿吗?