Concurrency 如何在actor模型中实现MVCC

Concurrency 如何在actor模型中实现MVCC,concurrency,actor,Concurrency,Actor,假设我已经将我的员工实体作为一个参与者来代表。我有两个服务也被建模为演员。它们都通过发送消息来操纵它接收到的员工参与者的状态。现在让我们假设两个服务都在处理同一个参与者。现在,雇员参与者完全有可能按照以下顺序从两个服务A和B接收状态更改消息 Employee因为我不知道a1-a3和b1-b3实际上代表什么,所以我只能假设正确回答这个问题。对我来说,您的消息似乎太细粒度了。例如,a1-a3可能试图在每条消息中只设置一个数据属性。b1-b3可能也是如此 但是,您的消息应该关注的是员工的行为,而不是设

假设我已经将我的员工实体作为一个参与者来代表。我有两个服务也被建模为演员。它们都通过发送消息来操纵它接收到的员工参与者的状态。现在让我们假设两个服务都在处理同一个参与者。现在,雇员参与者完全有可能按照以下顺序从两个服务A和B接收状态更改消息


Employee因为我不知道a1-a3和b1-b3实际上代表什么,所以我只能假设正确回答这个问题。对我来说,您的消息似乎太细粒度了。例如,a1-a3可能试图在每条消息中只设置一个数据属性。b1-b3可能也是如此

但是,您的消息应该关注的是员工的行为,而不是设置个人属性。因此,正如您自己所建议的,将消息设计为行为,其中a1-a3将折叠为单个操作请求。这通常被称为命令模式,您可以命令/告诉对象/参与者执行某些操作。这样做将导致每个消息具有正确的事务边界

请注意,上面我说的是“对象/参与者”。您可以/应该在对象设计中使用相同的方法,而不仅仅是针对参与者。从意图揭示接口和告诉您的域模型您希望它为您做什么的角度考虑,而不是将域对象/参与者视为愚蠢的数据持有者

这就是我对你问题的看法。嗯

沃恩

它们都操纵它接收到的雇员参与者的状态 通过发送信息

嗯。根据定义,参与者不与任何其他参与者共享其状态或操作。在一个消息处理的范围内,任何状态操作都是事务性的。从这个意义上讲,参与者代表一个聚合。消息通常是域事件/命令,具有普适语言的范围和部分。 DDD推理在考虑演员时有很大帮助

我的两分钱

塞吉伊
这就是我的结局。无论我在一个事务块中写了什么更改,我都会用一条消息生成一条消息,完全执行该事务!谢谢“变异/事务行为必须限定在单个消息中”。很高兴这是我们实际需要在actor Model中应用的模式。因此,我非常喜欢DDD和ActorModel范例的融合方式,使EventSourcing和CQR成为自然选择,从而为最终的一致性提供了适当的位置。@SergiyChernets我记得您在Microsoft Channel9 show中的演讲-关于服务结构的DDD和CQR。关于理论部分和图表的讨论非常好,但是(演示)实现有点出乎我的意料。太笨重,支持代码太多,分散了对实际领域的关注。我认为,问题在于C#语法本身。我用Erlang实现了类似的概念,这非常优雅。你有没有试过用F#来代替呢?我应该指出三件事。首先,我们演示的代码不是真实的代码。显然……)该代码是在1小时内创建的。展示DDD和Actor模型之间的方法和概念联系。其次,它是服务结构的虚拟参与者之上的抽象。第三,我们使用可用的技术堆栈在Azure平台上工作。我同意,特定实现语言的优雅总是有帮助的。