考虑一下在线购物的用例,我有库存和物品。我看到了几个使用 Akka 演员对此进行建模的选项。
-
例如,创建一个名为 Inventory 的持久参与者,将项目保持在列表中的状态。
-
创建一个名为"清单"的执行组件,然后为每个项目创建一个子永久执行组件。每个项目都保持自己的状态。
问题是 - 第二种选择有意义吗?何时应将实体保留为参与者的状态或将其建模为子参与者?在这种情况下,我们应该考虑什么?
根据我的理解,选项 2 更好。
-
库存可能有总和(项目(的价格,如果项目的价格发生变化,选项 1 不是一个好的选择。
-
如果项目是单个参与者,则选项 2 很容易处理由项目引起的更改。
这可能是主观的,我更喜欢选项二。
- 它允许我将思维缩小到一个小问题,当我在那个童星中时,我在这样做时没有考虑更大的图景。
- 以这种方式分解还有助于隔离测试项目逻辑以及任何更大的测试
- 儿童演员可以被杀死并重新生成,而不会影响所有其他物品的整个状态
- 演员很便宜,可以在典型的硬件上创建数百万 个
- 分布式数据:在更高级的用例中,它可以帮助您扩展不同的节点。例如,您可以拥有一个 akka 集群,其中每个集群节点负责实体子集(也称为分片(
何时应将实体保留为参与者的状态或将其建模为子参与者?
根据我的个人经验,当您具有分层状态并且第二级状态需要单独操作时,为每个二级实体创建子参与者是有意义的。例如:
case class Employee(Id, Name, Address)
在这种情况下,如果所有员工只有顶级参与者,则它必须具有可能如下所示的状态:
Map[Id, Employee]
如果消息如下:AddEmployee(Employee)
,DeleteEmployee(Id)
那么这没什么大不了的。但是,如果它们像:UpdateName(Id, Name)
或UpdateAddress(Id, Address)
那么在该地图上管理这些操作就会变得很麻烦。