Что будет с ответом, если актер отправителя уже ушел?

Рассмотрим следующий пример. 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");
}

4

Решение

Рассмотрим следующий пример. Актер 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 не может обнаружить сбой либо.

Тем не менее, актеры могут потерпеть неудачу в любое время, а среда выполнения может обеспечить распространение ошибок почти в реальном времени. Следовательно, ваш дизайн должен быть устойчивым к такому отказу, что означает, что вы должны использовать собственный механизм подтверждения для надежной доставки сообщений.

5

Другие решения

Других решений пока нет …