繁体   English   中英

在 Akka 中将实体保留为状态或子 Actor

[英]Keep an Entity as State or Child Actor in Akka

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

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

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

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

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

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

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

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

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

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

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

case class Employee(Id, Name, Address)

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

Map[Id, Employee]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM