请考虑以下示例.A hello_world actor
发送一个"hello"字符串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"); }
mavam.. 5
请考虑以下示例.一个hello_world actor发送一个"hello"字符串来镜像actor,然后立即终止.镜像演员返回的响应世界会发生什么?忽略?留在hello_world演员邮箱?
假设hello_world
已经终止.当CAF运行时将控制转移到mirror
下一次时,该语句return "world"
将尝试向发送方发送回复.由于发件人不再存在,运行时只是丢弃该邮件.
难道
mirror
知道它的反应会丢失吗?
TL; DR:如果您需要邮件传递保证,您必须在顶部实施自己的确认协议.
答案很长:通过监控一个演员,你可以挂钩它的终止.最终,这只是在监视actor的邮箱中排队一个特定的系统消息.假设没有消息重新排序的单跳场景,hello_world
将发送消息,终止,然后运行时将向所有监视的actor发送DOWN消息hello_world
.mirror
然后,邮箱首先包含字符串,然后包含DOWN消息.这意味着mirror
只能在尝试发送消息后检测到故障.
有一个例外:如果您mirror
作为优先级感知的 actor生成,它可以根据优先级处理消息.将其视为每个actor的两个独立邮箱.CAF中的所有系统消息都具有高优先级,这意味着您可能在回复之前检测到故障,但仅当运行时将控制转移到邮箱中已存在的两个消息mirror
之后.如果DOWN消息被延迟并且运行时将控制转移到只有位于邮箱中的字符串消息,那么您也无法检测到故障.mirror
mirror
mirror
也就是说,演员可以随时失败,运行时只能提供近实时的故障传播.因此,您的设计必须能够抵御此类故障,这意味着您必须使用自己的确认机制来实现可靠的消息传递.
请考虑以下示例.一个hello_world actor发送一个"hello"字符串来镜像actor,然后立即终止.镜像演员返回的响应世界会发生什么?忽略?留在hello_world演员邮箱?
假设hello_world
已经终止.当CAF运行时将控制转移到mirror
下一次时,该语句return "world"
将尝试向发送方发送回复.由于发件人不再存在,运行时只是丢弃该邮件.
难道
mirror
知道它的反应会丢失吗?
TL; DR:如果您需要邮件传递保证,您必须在顶部实施自己的确认协议.
答案很长:通过监控一个演员,你可以挂钩它的终止.最终,这只是在监视actor的邮箱中排队一个特定的系统消息.假设没有消息重新排序的单跳场景,hello_world
将发送消息,终止,然后运行时将向所有监视的actor发送DOWN消息hello_world
.mirror
然后,邮箱首先包含字符串,然后包含DOWN消息.这意味着mirror
只能在尝试发送消息后检测到故障.
有一个例外:如果您mirror
作为优先级感知的 actor生成,它可以根据优先级处理消息.将其视为每个actor的两个独立邮箱.CAF中的所有系统消息都具有高优先级,这意味着您可能在回复之前检测到故障,但仅当运行时将控制转移到邮箱中已存在的两个消息mirror
之后.如果DOWN消息被延迟并且运行时将控制转移到只有位于邮箱中的字符串消息,那么您也无法检测到故障.mirror
mirror
mirror
也就是说,演员可以随时失败,运行时只能提供近实时的故障传播.因此,您的设计必须能够抵御此类故障,这意味着您必须使用自己的确认机制来实现可靠的消息传递.