考虑以下示例。 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");
}
答案 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
也无法检测到失败。
也就是说,演员可以随时失败,运行时只能提供近实时的故障传播。因此,您的设计必须能够适应此类故障,这意味着您必须使用自己的确认机制来实现可靠的消息传递。