Transactions 如何处理内部补偿

Transactions 如何处理内部补偿,transactions,nservicebus,soa,transactional,nservicebus-sagas,Transactions,Nservicebus,Soa,Transactional,Nservicebus Sagas,我对N服务总线还不熟悉,正在努力学习这些概念 我正在尝试创建一个应用程序,该应用程序将在收取客户的一些付款后注册客户。注册过程中有两个第三方集成,例如支付和ExternalXYZ等 我想做以下步骤 从MVC控制器调用WebAPI层,它将 发送使用NService总线注册客户的命令 e、 g.开始登记程序 BeginRegistration过程将生成一个 关联id,创建一个DB条目,并通过 另一个命令,例如ProcessRegistration ProcessRegistration将执行以下操作

我对N服务总线还不熟悉,正在努力学习这些概念

我正在尝试创建一个应用程序,该应用程序将在收取客户的一些付款后注册客户。注册过程中有两个第三方集成,例如支付和ExternalXYZ等

我想做以下步骤

  • 从MVC控制器调用WebAPI层,它将 发送使用NService总线注册客户的命令 e、 g.开始登记程序
  • BeginRegistration过程将生成一个 关联id,创建一个DB条目,并通过 另一个命令,例如ProcessRegistration
  • ProcessRegistration将执行以下操作

    • 做一个数据库条目
    • 呼叫支付服务(通过DoPayment命令-包括创建DB条目、拨打电话、处理响应等步骤)
    • 调用ExternalXYZ web服务(通过CallExternalXYZ命令执行与DoPayment中类似的步骤)
    我正在考虑为这两个服务调用创建两个单独的命令,以便它们位于自己的小事务范围内。这些命令将记录服务调用前后的详细信息。(这可能有助于补偿逻辑,以防服务调用失败,我需要重试)

  • 以下是我的问题

  • 这听起来不错吗
  • 我将如何处理错误场景。例如,假设第3步的DB输入完成,然后在付款时发生超时(可能是卡被借记,并且在发布回复时发生超时,也可能是网络超时)。我如何确保该卡不会被借记两次
  • 如果DoPayment处理程序中出现错误,nservicebus会回滚ProcessRegistration saga中的事务吗
  • 如果出现错误,在调用服务之前,我通过DoPayment进行的任何DB调用将发生什么情况
  • 是否有任何样本显示如何处理传说中的补偿。我热衷于创建一个可以通过ProcessRegistration启动的补偿传奇,我可以利用日志表(此表记录了之前/之后的每个服务调用)启动补偿吗?

    几个指针:

    • CustomerId应由客户端应用程序创建(在您的情况下为web) 使用guid,其余部分应该使用异步消息传递
    • 组件不应该执行RPC(远程过程调用),而是使用pub/sub或命令
    有关示例,您可以查看

    再看一些 及

    再看看