如何创建在 akka 中表达层次结构的参与者?
How do I create actors that express hierarchical structures in akka?
我最近开始使用 akka 事件 sourcing/cluster 分片进行开发,感谢在线资源,我认为我了解了基本概念以及如何使用它创建简单的应用程序。然而,我正在努力将这种方法应用于稍微复杂的数据结构中:
例如,让我们考虑一下网页和 URL。
每个页面都可以用集群中的一个参与者表示(将其唯一 ID 作为页面的路径,例如 /questions/60037683)。
在每个页面上我都可以发出诸如
之类的命令
- 创建页面(如果页面不存在,将创建它)
- 编辑页面(编辑页面详情)
- 获取页面内容(和子内容)
等
向单个页面发出命令时,一切都很简单 "written on the manual"。但是我增加了网页可以有子页面的复杂性,所以在创建 "child page" 时,我需要父更新对其子页面的引用。
我想到了一些可能的方法,但感觉不完整。
- 将所有事件发送到单个网页,并在创建页面时查找父页面(如果有)并告知已添加新子页面
- 将所有事件发送到单个网页,并在创建页面时将消息发送给父级,然后它会创建一个新命令,告诉子级初始化
- 创建一个 WebPageRepository 基础设施,它将跟踪页面树并将 CRUD 命令中继到所有网页参与者。
我认为,我真正的问题是,在将消息转发给必须实际执行该工作的其他参与者时,正确处理 Futures 的 return。
我很困惑,如果能提供一些阅读资源,我们将不胜感激。
感谢您的宝贵时间。
编辑:第一个版本讨论的是通用的分层文件系统结构。我更新了真实目的、网页和网址,并试图更好地阐明我的问题
经过几个月的搜索,我得出的结论是,我正在做的是尝试让 actor 进行交易,这样当创建某些东西时,父级也会以一种安全的方式更新,这意味着如果一个操作失败,所有成功完成的操作都会回滚。
在我看来,最好的模式被证明是 saga 模式,它给整个过程增加了一点复杂性,但在漫长的过程中 运行 它满足了我的需要。
基本上我最终将主要角色实现为一个独立的部分(应该是),它可以接收创建命令和添加子命令。
然后有一个 saga actor 负责创建内容、将子项添加到父项并在过程中出现故障时回滚所有内容。
如果其他人有更好的解决方案,我会很高兴听到
我最近开始使用 akka 事件 sourcing/cluster 分片进行开发,感谢在线资源,我认为我了解了基本概念以及如何使用它创建简单的应用程序。然而,我正在努力将这种方法应用于稍微复杂的数据结构中:
例如,让我们考虑一下网页和 URL。 每个页面都可以用集群中的一个参与者表示(将其唯一 ID 作为页面的路径,例如 /questions/60037683)。
在每个页面上我都可以发出诸如
之类的命令- 创建页面(如果页面不存在,将创建它)
- 编辑页面(编辑页面详情)
- 获取页面内容(和子内容)
等
向单个页面发出命令时,一切都很简单 "written on the manual"。但是我增加了网页可以有子页面的复杂性,所以在创建 "child page" 时,我需要父更新对其子页面的引用。
我想到了一些可能的方法,但感觉不完整。
- 将所有事件发送到单个网页,并在创建页面时查找父页面(如果有)并告知已添加新子页面
- 将所有事件发送到单个网页,并在创建页面时将消息发送给父级,然后它会创建一个新命令,告诉子级初始化
- 创建一个 WebPageRepository 基础设施,它将跟踪页面树并将 CRUD 命令中继到所有网页参与者。
我认为,我真正的问题是,在将消息转发给必须实际执行该工作的其他参与者时,正确处理 Futures 的 return。
我很困惑,如果能提供一些阅读资源,我们将不胜感激。
感谢您的宝贵时间。
编辑:第一个版本讨论的是通用的分层文件系统结构。我更新了真实目的、网页和网址,并试图更好地阐明我的问题
经过几个月的搜索,我得出的结论是,我正在做的是尝试让 actor 进行交易,这样当创建某些东西时,父级也会以一种安全的方式更新,这意味着如果一个操作失败,所有成功完成的操作都会回滚。 在我看来,最好的模式被证明是 saga 模式,它给整个过程增加了一点复杂性,但在漫长的过程中 运行 它满足了我的需要。
基本上我最终将主要角色实现为一个独立的部分(应该是),它可以接收创建命令和添加子命令。
然后有一个 saga actor 负责创建内容、将子项添加到父项并在过程中出现故障时回滚所有内容。
如果其他人有更好的解决方案,我会很高兴听到