【问题标题】:How to handle compensation inside SagaSaga内部如何处理补偿
【发布时间】:2015-05-05 12:07:35
【问题描述】:

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

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

我正在考虑执行以下步骤

  1. 从 MVC 控制器调用 WebAPI 层,这将 发送使用 NService 总线注册客户的命令 例如开始注册过程
  2. BeginRegistrationProcess 将生成一个 相关 id,创建一个数据库条目并通过 另一个命令,例如 ProcessRegistration
  3. ProcessRegistration 会做以下事情

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

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

这是我的问题

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

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

【问题讨论】:

    标签: transactions nservicebus soa transactional nservicebus-sagas


    【解决方案1】:

    几点建议:

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

    有关示例,您可以查看the sample here

    也可以看看the presentations here 还有Udi's blog

    另请查看Community discussion group

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      相关资源
      最近更新 更多