在 Akka 中将实体保留为状态或子参与者



考虑一下在线购物的用例,我有库存和物品。我看到了几个使用 Akka 演员对此进行建模的选项。

  1. 例如,创建一个名为 Inventory 的持久参与者,将项目保持在列表中的状态。

  2. 创建一个名为"清单"的执行组件,然后为每个项目创建一个子永久执行组件。每个项目都保持自己的状态。

问题是 - 第二种选择有意义吗?何时应将实体保留为参与者的状态或将其建模为子参与者?在这种情况下,我们应该考虑什么?

根据我的理解,选项 2 更好。

  1. 库存可能有总和(项目(的价格,如果项目的价格发生变化,选项 1 不是一个好的选择。

  2. 如果项目是单个参与者,则选项 2 很容易处理由项目引起的更改。

这可能是主观的,我更喜欢选项二。

  • 它允许我将思维缩小到一个小问题,当我在那个童星中时,我在这样做时没有考虑更大的图景。
  • 以这种方式分解还有助于隔离测试项目逻辑以及任何更大的测试
  • 儿童演员可以被杀死并重新生成,而不会影响所有其他物品的整个状态
  • 演员很便宜,可以在典型的硬件上创建数百万
  • 分布式数据:在更高级的用例中,它可以帮助您扩展不同的节点。例如,您可以拥有一个 akka 集群,其中每个集群节点负责实体子集(也称为分片(

何时应将实体保留为参与者的状态或将其建模为子参与者?

根据我的个人经验,当您具有分层状态并且第二级状态需要单独操作时,为每个二级实体创建子参与者是有意义的。例如:

case class Employee(Id, Name, Address)

在这种情况下,如果所有员工只有顶级参与者,则它必须具有可能如下所示的状态:

Map[Id, Employee]

如果消息如下:AddEmployee(Employee)DeleteEmployee(Id)那么这没什么大不了的。但是,如果它们像:UpdateName(Id, Name)UpdateAddress(Id, Address)那么在该地图上管理这些操作就会变得很麻烦。

最新更新