Scala 我如何创建在akka中表达等级结构的演员?

Scala 我如何创建在akka中表达等级结构的演员?,scala,akka,event-sourcing,akka-cluster,Scala,Akka,Event Sourcing,Akka Cluster,我最近开始使用akka事件源/集群切分进行开发,多亏了在线资源,我想我理解了基本概念以及如何使用它创建简单的应用程序。然而,我正在努力将这种方法应用到稍微复杂的数据结构中: 例如,让我们考虑一下网页和URL。 每个页面都可以用集群中的一个参与者来表示(将其唯一id作为页面的路径,例如/questions/60037683) 在每个页面上,我都可以发出如下命令 创建页面(因此,如果页面不存在,将创建该页面) 编辑页面(编辑页面的详细信息) 获取页面内容(和子项) 等等 当向单个页面发出命令时,

我最近开始使用akka事件源/集群切分进行开发,多亏了在线资源,我想我理解了基本概念以及如何使用它创建简单的应用程序。然而,我正在努力将这种方法应用到稍微复杂的数据结构中:

例如,让我们考虑一下网页和URL。 每个页面都可以用集群中的一个参与者来表示(将其唯一id作为页面的路径,例如/questions/60037683)

在每个页面上,我都可以发出如下命令

  • 创建页面(因此,如果页面不存在,将创建该页面)
  • 编辑页面(编辑页面的详细信息)
  • 获取页面内容(和子项)
等等

当向单个页面发出命令时,一切都很简单,因为它“写在手册上”。但是我增加了网页可以有子页面的复杂性,因此在创建“子页面”时,我需要父页面更新对其子页面的引用

我想到了一些可能的方法,但感觉不完整

  • 将所有事件发送到单个网页,并在创建网页时查找父网页(如果有)并告知已添加新的子网页
  • 将所有事件发送到单个网页,并在创建页面时,将消息发送到父级,然后它将创建一个新命令,该命令将通知子级进行初始化
  • 创建一个作为WebPageRepository的基础设施,该基础设施将跟踪页面树,并将CRUD命令传递给所有网页参与者
我认为,我真正的问题是,在向其他必须实际履行职责的参与者传递信息时,正确处理期货的回报

我正在制造很多混乱,一些阅读资源将不胜感激

谢谢你抽出时间


编辑:第一个版本讨论的是一种类似于文件系统的一般层次结构。我更新了真实目的、网页和URL,并试图更好地澄清我的问题

经过几个月的搜索,我得出的结论是,我所做的是让参与者以事务性的方式进行行为,这样当创建某个内容时,父级也会以安全的方式进行更新,这意味着如果一个操作失败,所有成功完成的操作都将回滚。 在我看来,最好的模式是saga模式,它为整个过程增加了一点复杂性,但从长远来看,它满足了我的需要

基本上,我最终实现了一个独立的主参与者(应该是这样),它可以接收create命令和addchildren命令

然后是一个传奇演员,负责创建内容,将孩子添加到家长,并在过程中出现故障时回滚所有内容


如果其他人有更好的解决方案,我会很高兴听到答案的

经过几个月的搜索,我得出的结论是,我所做的是让参与者以事务性的方式进行行为,这样在创建某个对象时,父对象也会以安全的方式进行更新,这意味着如果一个操作失败,所有成功完成的操作都将回滚。 在我看来,最好的模式是saga模式,它为整个过程增加了一点复杂性,但从长远来看,它满足了我的需要

基本上,我最终实现了一个独立的主参与者(应该是这样),它可以接收create命令和addchildren命令

然后是一个传奇演员,负责创建内容,将孩子添加到家长,并在过程中出现故障时回滚所有内容


如果其他人有更好的解决方案,我会很高兴首先听到答案。

首先。。。这个目录和文件的例子有点尴尬,因为目录和文件是静态资源,对于参与者来说并不是很好的用例。第二件事是,每个系统设计都是一个高度基于意见和需求的问题。所以,即使你提供了一个更好的例子,我也不确定我们的建议是否对你的目的有任何好处。好吧,“这对演员来说并不是一个很好的用例”是一个完全可以接受的答案,我已经开始考虑这个问题了。尽管如此,这个例子仍然适用,因为真正的用例不是文件和目录,而是网页,所以正如您所指出的,基本上仍然是静态的。我仍将等待其他人的意见,同时回到设计表,以另一种可能更经典的方式来思考它。谢谢。当你开始谈论网页/URL时。。。情况变化很大。因为,如果您的参与者更像“用于原子访问这些URL的客户端”,那么参与者模型突然变得更有意义。是的,这正是我的意图:参与者==网页在集群中通过其路径(例如/questions/60037683)以单音识别,我可以在该网页上执行操作,例如,编辑或在其内部发布子页面。这就是问题开始的时候,当将页面嵌套到其他页面时,让整个系统知道这个嵌套结构已经改变。@Luca为什么需要“让整个系统知道这个嵌套结构已经改变”?侦听器不会只对特定目录的更改感兴趣吗?首先。。。这个目录和文件的例子有点尴尬,因为目录和文件是静态资源,对于参与者来说并不是很好的用例。第二件事是,每个系统设计都是一个高度基于意见和需求的问题。所以,即使你提供了一个更好的例子,我也不确定我们的建议是否对你的目的有任何好处。好吧,“这对演员来说并不是一个很好的用例”是一个完全可以接受的答案,我已经开始考虑这个问题了。不过,这个例子仍然符合实际情况