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