0

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

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

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

问题是——第二种选择有意义吗?我什么时候应该将实体保持为演员的状态或将其建模为子演员?在这种情况下我们应该考虑什么?

4

2 回答 2

2

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

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

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

于 2020-01-14T03:04:09.340 回答
1

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

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

我什么时候应该将实体保持为演员的状态或将其建模为子演员?

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

case class Employee(Id, Name, Address)

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

Map[Id, Employee]

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

于 2020-01-14T19:33:52.050 回答