Рассмотрим следующий пример. 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");
}
Рассмотрим следующий пример. Актер hello_world отправляет строку «hello» для зеркального отображения актера, а затем немедленно завершается. Что будет с ответным миром, возвращенным из зеркального актера? Игнорируется? Оставил в почтовом ящике актера hello_world?
Предположим, что hello_world
уже прекращено. Когда среда выполнения CAF передает управление в mirror
в следующий раз, заявление return "world"
будет пытаться отправить ответ отправителю. Поскольку отправитель больше не существует, среда выполнения просто отбрасывает сообщение.
Может ли
mirror
знаете, его ответ потерян?
TL; DR: вы должны реализовать свой собственный протокол подтверждения сверху, если вам нужны гарантии доставки сообщений.
Длинный ответ: от мониторинг актер, вы можете зацепить его прекращение. В конечном счете, это просто помещает конкретное системное сообщение в почтовый ящик субъекта мониторинга. Предполагая сценарий с одним переходом, когда переупорядочение сообщений не может иметь место, hello_world
отправит сообщение, прекратит работу, а затем среда выполнения отправит сообщение ВНИЗ всем субъектам, которые наблюдали hello_world
, mirror
Почтовый ящик содержит сначала строку, а затем сообщение ВНИЗ. Это означает mirror
может обнаружить сбой только после попытки отправить сообщение.
Есть одно исключение: если вы появляетесь mirror
как приоритеты в курсе актер, он может обрабатывать сообщения в зависимости от их приоритета. Думайте об этом как о двух отдельных почтовых ящиках на каждого актера. Все системные сообщения в CAF имеют высокий приоритет, что означает, что существует сценарий, в котором вы может быть быть в состоянии обнаружить сбой перед ответом, но только когда среда выполнения передает управление в mirror
после и то и другое сообщения уже существуют в mirror
почтовый ящик. Если сообщение ВНИЗ задерживается и среда выполнения передает управление в mirror
просто строковое сообщение в почтовом ящике, то вы mirror
не может обнаружить сбой либо.
Тем не менее, актеры могут потерпеть неудачу в любое время, а среда выполнения может обеспечить распространение ошибок почти в реальном времени. Следовательно, ваш дизайн должен быть устойчивым к такому отказу, что означает, что вы должны использовать собственный механизм подтверждения для надежной доставки сообщений.
Других решений пока нет …