我正在尝试遵循最佳实践并在 Akka 中应用错误内核模式。根据这里的报价:
如果一个actor携带了非常重要的数据(即如果可以避免,它的状态不会丢失),这个actor应该将任何可能危险的子任务分配给它所监督的子任务,并适当地处理这些子任务的失败。根据请求的性质,最好为每个请求创建一个新的子请求,这样可以简化收集回复的状态管理。这被称为 Erlang 的“错误内核模式”。
...创建孩子并将容易出错的工作委托给他们是一个好主意,将重要状态集中在父母/主管演员中。
在这种情况下,如果具有重要状态的参与者由于某种原因重新启动,我是否需要处理来自它的陈旧子项(在重新启动之前创建)的消息?
让我们用例子来说明这一点。
让我们假设我有 3 个演员:(A
是 的父母/主管B
)、B
(是 的父母/主管C
,包含重要状态)和C
。
A
的监督策略被配置为在异常时重新启动它的孩子。
C
在B
的构造函数中创建。
然后让我们假设消息bc
是从表单发送B
到的C
。C
开始处理它(让我们想象它在那里运行长时间运行的计算),一旦完成将回复B
with cb
。
现在,让我们假设before cb
被发送到并由B
A
将消息发送ab
到处理B
。此消息导致B
抛出异常,并且由于A
的监督策略决定B
将重新启动。
作为 的子级B
C
将在B
' 重新启动期间停止(C'
将在B
' 的构造函数中创建新的)。
在重新启动之前发送的重新启动B
接收是否会重新启动?cb
C
B
如果是, ( ) 的子项是否会sender
被cb
视为C
restarted 的子项B
?演员 ref 的C
和C'
是否相等(假设C
和C'
s 的名字相等)?