在 Akka 中保留一个实体作为状态或儿童演员

Keep an Entity as State or Child Actor in Akka

考虑在线购物的用例,我有库存和物品。我看到几个选项可以使用 Akka actor 对此进行建模。

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

  2. 创建一个名为 Inventory 的 actor,然后为每个项目创建一个子持久性 actor。每个项目保持自己的状态。

问题是 - 第二个选项有意义吗?我什么时候应该将实体保留为演员的状态或将其建模为儿童演员?这种情况应该注意什么?

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

  1. 库存可能有sum(items)的价格,如果改变item的价格,选项1不是一个好的选择。

  2. 如果item是单个actor,方案2很容易处理item引起的变化

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

  • 当我演那个童星的时候,它让我可以把我的想法缩小到一个小问题上,而在这样做的时候我没有考虑大局。
  • 除了任何更大的测试之外,以这种方式分解还有助于隔离测试项目逻辑
  • 可以在不影响所有其他项目的整个状态的情况下杀死和重新生成子演员
  • Actor 很便宜,可以在典型的硬件上创建数百万个
  • 分布式数据:在更高级的用例中,它可以帮助您扩展不同的节点。例如,您可以有一个 akka 集群,其中每个集群节点负责实体的一个子集(又名分片)

When should I keep an entity as state of an actor or model it as a child actor?

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

case class Employee(Id, Name, Address)

在这种情况下,如果所有员工只有顶级 actor,则它必须具有如下状态:

Map[Id, Employee]

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