如何在actor模型中实现MVCC
How to achieve MVCC in actor model
假设我将我的 Employee 实体表示为演员。我有 2 个服务也被建模为演员。他们都通过向它发送消息来操纵它收到的 Employee actor 的状态。现在假设这两个服务正在处理同一个参与者。现在,雇员 Actor 完全有可能按以下顺序从两个服务 A 和 B
接收状态更改消息
Employee <- |a1|a2|a3|b1|b2|b3|
这很好。但有时不是
Employee <- |a1|b1|a2|b2|a3|b3|
也许 a2
依赖于 a1
改变的状态,但 b1
改变了它
类似于数据库,我们有事务,因此我们可以在整个事务生命周期中处理单个 snapshot/version 数据。
在命令式模型中,我们将锁定整个员工对象并更新其状态,类似于数据库的做法。
那么 actor 是否有可能接收批量消息,这些消息将作为一个原子消息系列进行处理?还是我的数据建模本身存在缺陷?
因为我不知道a1-a3和b1-b3到底代表什么,所以只能假设答对了。在我看来,您的消息粒度太细了。例如,也许 a1-a3 试图在每条消息中只设置一个数据属性。 b1-b3 可能也是如此。
但是,您的消息应该关注的是引起员工的行为,而不是设置个人属性。因此,正如您自己建议的那样,将您的消息设计为行为,其中 a1-a3 将折叠为单个操作请求。这通常称为命令模式,您 command/tell 一个 object/actor 来做某事。这样做将导致每条消息的事务边界正确。
请注意,上面我说 "object/actor." 您 can/should 在对象设计中使用相同的方法,而不仅仅是演员。考虑 intention-revealing 接口并告诉您的域模型您希望它为您做什么,而不是将域 objects/actors 视为愚蠢的数据持有者。
这就是我对你的问题的看法。 HTH.
沃恩
Both of them manipulate the state of an Employee actor it has received
by sending it messages.
嗯。根据定义,Actor 不会与任何其他 Actor 共享其状态或操作。在 one 消息处理的范围内,任何状态操作都是事务性的。在这个意义上,Actor 代表聚合。消息通常是 Domain events/commands 并且具有范围和通用语言的一部分。
在考虑 Actors 时,DDD 推理很有帮助。
我的两分钱
谢尔盖
<><
假设我将我的 Employee 实体表示为演员。我有 2 个服务也被建模为演员。他们都通过向它发送消息来操纵它收到的 Employee actor 的状态。现在假设这两个服务正在处理同一个参与者。现在,雇员 Actor 完全有可能按以下顺序从两个服务 A 和 B
接收状态更改消息Employee <- |a1|a2|a3|b1|b2|b3|
这很好。但有时不是
Employee <- |a1|b1|a2|b2|a3|b3|
也许 a2
依赖于 a1
改变的状态,但 b1
改变了它
类似于数据库,我们有事务,因此我们可以在整个事务生命周期中处理单个 snapshot/version 数据。
在命令式模型中,我们将锁定整个员工对象并更新其状态,类似于数据库的做法。
那么 actor 是否有可能接收批量消息,这些消息将作为一个原子消息系列进行处理?还是我的数据建模本身存在缺陷?
因为我不知道a1-a3和b1-b3到底代表什么,所以只能假设答对了。在我看来,您的消息粒度太细了。例如,也许 a1-a3 试图在每条消息中只设置一个数据属性。 b1-b3 可能也是如此。
但是,您的消息应该关注的是引起员工的行为,而不是设置个人属性。因此,正如您自己建议的那样,将您的消息设计为行为,其中 a1-a3 将折叠为单个操作请求。这通常称为命令模式,您 command/tell 一个 object/actor 来做某事。这样做将导致每条消息的事务边界正确。
请注意,上面我说 "object/actor." 您 can/should 在对象设计中使用相同的方法,而不仅仅是演员。考虑 intention-revealing 接口并告诉您的域模型您希望它为您做什么,而不是将域 objects/actors 视为愚蠢的数据持有者。
这就是我对你的问题的看法。 HTH.
沃恩
Both of them manipulate the state of an Employee actor it has received by sending it messages.
嗯。根据定义,Actor 不会与任何其他 Actor 共享其状态或操作。在 one 消息处理的范围内,任何状态操作都是事务性的。在这个意义上,Actor 代表聚合。消息通常是 Domain events/commands 并且具有范围和通用语言的一部分。 在考虑 Actors 时,DDD 推理很有帮助。
我的两分钱
谢尔盖 <><