将CQR应用于信用卡收费(使用AKKA)

将CQR应用于信用卡收费(使用AKKA),akka,cqrs,Akka,Cqrs,鉴于我对CQR有点困惑,我想进一步了解以下情况: 我有一个演员向用户的信用卡收费。为此,请联系执行该操作的银行外部服务部门,获得确认结果 我想知道如何将此应用于CQR 需要在此处写入的信息是,特定用户已收取一定金额的费用。因此,生成的事件是收费的(UserID、Card、Amount)。差不多吧 问题是,我所看到的所有示例(尤其是AKKA示例)只有在命令被验证后才会生成事件,这样它才会被保存在日志中,并用于更新参与者的状态。日志的另一面可以是红色的,这样就可以在这里创建一个阅读视图 同样,在这些

鉴于我对CQR有点困惑,我想进一步了解以下情况:

我有一个演员向用户的信用卡收费。为此,请联系执行该操作的银行外部服务部门,获得确认结果

我想知道如何将此应用于CQR

需要在此处写入的信息是,特定用户已收取一定金额的费用。因此,生成的事件是收费的(UserID、Card、Amount)。差不多吧

问题是,我所看到的所有示例(尤其是AKKA示例)只有在命令被验证后才会生成事件,这样它才会被保存在日志中,并用于更新参与者的状态。日志的另一面可以是红色的,这样就可以在这里创建一个阅读视图

同样,在这些示例中,updatestate函数通常具有执行命令的逻辑,因为命令直接对应于一天结束时的状态更新。这是典型的购物篮示例:CreateOrder、AddLineItem。所有这些命令在事件中直接转换,对应于更新状态函数的特定代码

然而,在本例中,需要实际联系外部服务,向用户收费,然后生成事件。无法在更新状态下或在阅读日志后联系外部服务。这毫无意义

因此,我想知道,具体来说,这是如何做到的,在哪里,何时,在CQR的精神。如果有人能澄清这一点,那就太好了

非常感谢,


Maatari

我可以想出两种方法

首先是一个简单的方法。命令是
DoCharge(用户ID、卡、金额)
。收到此命令后,您将调用外部支付服务。如果此操作已成功完成,则生成一个事件,
已收费(UserId、Card、Amount、TransactionId)
,并将其存储在日记账中

当然,这不是完全安全的方式,因为您的参与者在向支付服务发送请求后,但在收到并坚持成功完成的确认之前,可能会崩溃。那么你就有向用户收取两次费用的风险。为了克服这种风险,您必须使您的支付操作幂等。下面是如何做到这一点。此示例基于经典文章。我在这里总结一下

您需要将支付操作分为两个阶段。在第一种情况下,支付服务创建一个事务令牌。它只识别交易,尚未执行任何财务操作。创建时,您的服务将接收标识符并将其保存在日志中


在下一个阶段中,您将执行与第一阶段的标识符关联的支付。如果您的角色现在在中间失败,而在支付服务侧成功执行操作,则交易令牌将被标记为支付服务处理,并且不会让您向客户收取两次费用。现在,如果重新启动失败的参与者,并且它尝试运行与现有事务令牌关联的支付,则支付服务应该返回“已执行”之类的结果。当然,最后还要将操作结果保存在日志中。

我可以想出两种方法

首先是一个简单的方法。命令是
DoCharge(用户ID、卡、金额)
。收到此命令后,您将调用外部支付服务。如果此操作已成功完成,则生成一个事件,
已收费(UserId、Card、Amount、TransactionId)
,并将其存储在日记账中

当然,这不是完全安全的方式,因为您的参与者在向支付服务发送请求后,但在收到并坚持成功完成的确认之前,可能会崩溃。那么你就有向用户收取两次费用的风险。为了克服这种风险,您必须使您的支付操作幂等。下面是如何做到这一点。此示例基于经典文章。我在这里总结一下

您需要将支付操作分为两个阶段。在第一种情况下,支付服务创建一个事务令牌。它只识别交易,尚未执行任何财务操作。创建时,您的服务将接收标识符并将其保存在日志中


在下一个阶段中,您将执行与第一阶段的标识符关联的支付。如果您的角色现在在中间失败,而在支付服务侧成功执行操作,则交易令牌将被标记为支付服务处理,并且不会让您向客户收取两次费用。现在,如果重新启动失败的参与者,并且它尝试运行与现有事务令牌关联的支付,则支付服务应该返回“已执行”之类的结果。当然,最后还要将操作结果保存在日志中。

我可以想出两种方法

首先是一个简单的方法。命令是
DoCharge(用户ID、卡、金额)
。收到此命令后,您将调用外部支付服务。如果此操作已成功完成,则生成一个事件,
已收费(UserId、Card、Amount、TransactionId)
,并将其存储在日记账中

当然,这不是完全安全的方式,因为您的参与者在向支付服务发送请求后,但在收到并坚持成功完成的确认之前,可能会崩溃。那么你就有向用户收取两次费用的风险。为了克服这种风险,您必须使您的支付操作幂等。下面是如何做到这一点。此示例基于经典文章。我在这里总结一下

您需要将支付操作分为两个阶段。在第一种情况下,支付服务创建一个事务令牌。它只是识别了