如果发送者演员已经离开,会有什么反应?

时间:2015-12-18 15:30:21

标签: c++ c++-actor-framework

考虑以下示例。 hello_world actor发送"你好"字符串到mirror actor,然后立即终止。从world返回的回复mirror actor会发生什么?忽略?留在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");
}

1 个答案:

答案 0 :(得分:5)

  

考虑以下示例。一个hello_world actor发送一个“hello”字符串来镜像actor,然后立即终止。镜像演员返回的响应世界会发生什么?忽略?留在hello_world演员邮箱?

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

  

mirror是否知道其回复丢失了?

TL; DR :如果您需要邮件传递保证,您必须在顶部实施自己的确认协议。

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

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

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