如何处理佐贺内部的赔偿

时间:2015-05-05 12:07:35

标签: transactions nservicebus soa transactional nservicebus-sagas

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

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

我正在考虑以下步骤

  1. 从MVC控制器调用WebAPI层,这将是 发送命令以使用NService总线注册客户 例如BeginRegistrationProcess
  2. BeginRegistrationProcess将生成一个 相关ID,创建一个数据库条目,然后启动一个Saga 另一个命令,例如ProcessRegistration
  3. ProcessRegistration将执行以下操作

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

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

  4. 以下是我的问题

    1. 这听起来不错吗?
    2. 我将如何处理错误情况。例如,表示完成步骤3的DB输入,然后在进行支付时,发生超时(可能是卡被借记并且在发布回复时发生超时或可能是网络超时)。我如何确保卡不会被扣款两次。
    3. 如果DoPayment处理程序出错,nservicebus会回滚ProcessRegistration传奇中的事务吗
    4. 在发生错误的情况下,在调用服务之前,我将从DoPayment中进行的任何数据库调用会发生什么。
    5. 是否有任何样本显示如何处理传单中的补偿。我热衷于创建一个可以由ProcessRegistration启动的补偿传奇,我可以利用日志表(该表有每个服务调用之前/之后的记录)来启动补偿吗?

1 个答案:

答案 0 :(得分:0)

有几点指示:

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

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

还要看一些the presentations hereUdi's blog

另请查看Community discussion group

HTH