使用akka-typed,我试图创建一个事件源应用程序,在这个应用程序中,一个actor上的命令可以对另一个actor造成影响。具体来说,我有以下情况。
当RootActor被发出一个 CreateBranch
命令,进行验证,如果一切正常,结果一定是这样。
OperationDone
现在我唯一能想到的是。RootActor处理这个事件,然后作为一个副作用 向BranchActor发出一个命令,BranchActor保存一个初始化的eventt,然后回复给RootActor,最后回复给原来的发布者。
不过这看起来太复杂了,因为。
那么我的问题是:我不能直接从系统中保存。RootActor
两个事件,一个是自己的,一个是目标的。BranchActor
另外,作为一个额外的问题:这对事件源来说是一个好的做法吗?
那么我的问题是:我不能从RootActor中保存两个事件,一个是自己的,一个是目标BranchActor的吗?
不,听起来很老套,但你能对一个actor做的唯一事情就是向它发送消息。如果你一定要做你正在做的事情,你的道路是正确的。如管到等。
这就算是事件源的好做法吗?
这不是一个好的做法。到底是次优还是平反模式,还是值得商榷的。(我觉得我之所以自信地说这句话,是因为这一点 Lightbend讨论线 在那里辩论,一方认为 "棘手,但我不后悔",另一方认为 "明确的反模式")。)
引用某人在内部Slack中的一段话(未经他的允许,我不想将其归于他,但我把它保存下来,因为它似乎很优雅地概括了这种情况)。
如果一个事件来源的actor需要联系另一个actor来决定是否可以持久化一个事件,那么我们就不是在建模一个一致性边界了。它应该只依赖于[它所拥有的]范围内的状态(自己的状态和传入的命令)。......所有的体操(坚持其等待确认的事实,储藏,管道到自己)来使它正常工作,这表明我们没有尊重一致性边界。
如果你不能修复你的聚合,使一个行为者负责整个一致性边界,更好的做法是事先丰富命令:本质上建立一个Saga模式。