0

我是 nservice 总线的新手,正在尝试学习这些概念。

我正在尝试创建一个应用程序,该应用程序会在从客户那里收取一些款项后注册客户。注册过程中有几个第三方集成,例如 Payment 和 ExternalXYZ 等

我正在考虑执行以下步骤

  1. 从 MVC 控制器调用 WebAPI 层,它将发送一个使用 NService 总线注册客户的命令,例如 BeginRegistrationProcess
  2. BeginRegistrationProcess 将生成一个关联 ID,创建一个 DB 条目并通过另一个命令(例如 ProcessRegistration)启动一个 Saga
  3. ProcessRegistration 将做以下事情

    • 创建一个 Db 条目
    • 调用支付服务(通过 DoPayment 命令 - 这将包括创建数据库条目、拨打电话、处理响应等步骤)
    • 调用 ExternalXYZ Web 服务(通过 CallExternalXYZ 命令——与 DoPayment 中类似的步骤)

    我正在考虑为这两个服务调用创建两个单独的命令,以便它们在自己的小事务范围内。这些命令将在进行服务调用之前和之后记录详细信息。(如果服务调用失败并且我需要重试它们,这可能有助于补偿逻辑)

这是我的问题

  1. 这听起来不错吗?
  2. 我将如何处理错误情况。例如,说第 3 步的 DB 条目已完成,然后在付款时发生超时(可能是卡被借记并且在发布回复时发生超时,或者可能是网络超时)。我将如何确保该卡不会被借记两次。
  3. 如果 DoPayment 处理程序中出现错误,nservicebus 将回滚 ProcessRegistration 传奇中的事务
  4. 如果出现错误,我在调用服务之前从 DoPayment 进行的任何数据库调用会发生什么。

是否有任何示例显示如何在 sagas 中处理补偿。我热衷于创建一个可由 ProcessRegistration 启动的补偿传奇,我可以利用日志表(该表有每个服务调用之前/之后的记录)来启动补偿吗?

4

1 回答 1

0

几个指针:

  • CustomerId 应由客户端应用程序(在您的情况下为 Web)使用 Guid 创建,其余应使用异步消息传递。
  • 组件不应执行 RPC(远程过程调用),而应使用 pub/sub 或命令

对于示例,您可以在此处查看示例

还可以在这里查看一些演示文稿 和Udi 的博客

另请查看社区讨论组

高温高压

于 2015-05-06T10:24:30.567 回答