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