如果发送方演员已经离开,响应会发生什么?

What will happen to response if the sender actor is already gone?

考虑以下示例。 hello_world actor 发送一个 "hello" 字符串到 mirror actor,然后它立即终止。从 mirror actor 返回的响应 world 会怎样?忽略?留在 hello_world actor 邮箱?镜像能知道它的响应丢失了吗?

behavior mirror(event_based_actor* self)
{
    return { [=](std::string s){ return "world"; } };
}
void hello_world(event_based_actor* self, const actor& theMirror)
{
    self->send(theMirror, "hello");
}

Consider the following example. A hello_world actor sends a "hello" string to mirror actor, then it terminates immediately. What will happen to the response world returned from mirror actor? Ignored? Left in hello_world actor mailbox?

假设hello_world已经终止。当 CAF 运行时下次将控制权转移到 mirror 时,语句 return "world" 将尝试向发送者发送回复。由于发件人不再存在,运行时只是丢弃该消息。

Could the mirror know its response is lost?

TL;DR:如果你需要消息传递保证,你必须在上面实现你自己的确认协议。

长答案:通过监控一个actor,你可以挂钩它的终止。最终,这只是在监控参与者的邮箱中排队特定的系统消息。假设没有消息重新排序的单跳场景,hello_world 将发送一条消息,终止,然后运行时将向所有监视 hello_world 的参与者发送一条 DOWN 消息。 mirror 的邮箱首先包含字符串,然后是 DOWN 消息。这意味着 mirror 只能在尝试发送消息后检测到失败。

有一个例外:如果您将 mirror 生成为 优先级感知 actor,它可以根据消息的优先级处理消息。将其视为每个演员两个独立的邮箱。 CAF 中的所有系统消息都具有高优先级,这意味着存在这样一种情况,您 可能 能够在回复之前检测到故障,但只有当运行时将控制权转移到 mirror 时在 条消息已经存在于 mirror 的邮箱中之后。如果 DOWN 消息被延迟并且运行时将控制转移到 mirror 而邮箱中只有字符串消息,那么您 mirror 也无法检测到故障。

也就是说,actor 随时都可能失败,运行时只能提供近乎实时的故障传播。因此,您的设计必须能够应对此类故障,这意味着您必须推出自己的确认机制以实现可靠的消息传递。