Я использую Akka.NET для реализации системы акторов, в которой некоторые акторы создаются по запросу и удаляются после настраиваемого периода простоя (для этого я использую механизм Akka "ReceiveTimeout"). Каждый из этих субъектов идентифицируется ключом, и не должно существовать двух субъектов с одним и тем же ключом.
Эти субъекты в настоящее время создаются и удаляются общим супервизором. Супервизора можно попросить вернуть ссылку на актера, соответствующего данному ключу, либо путем возврата существующего, либо создания нового, если актор с этим ключом еще не существует. Когда субъект получает сообщение «ReceiveTimeout», он уведомляет супервизора, который, в свою очередь, убивает его с помощью «PoisonPill».
У меня проблема при отправке сообщения одному из этих субъектов сразу после его удаления. Я заметил, что отправка сообщения мертвому актеру не создает исключения. Хуже того, при отправке сообщения «Спросить» отправитель остается заблокированным, ожидая неопределенное время (или до истечения времени ожидания) ответа, который он никогда не получит.
Сначала я подумал о механизме Akka "Deatchwatch" для отслеживания жизненного цикла актера. Но, если я не ошибаюсь, сообщение «Прервано», отправленное умирающим актором, будет получено контролирующим актером асинхронно, как и любое другое сообщение, поэтому проблема все еще может возникать между смертью целевого актора и получением его Сообщение «Прервано».
Чтобы решить эту проблему, я сделал так, что любой, кто запрашивает у супервизора ссылку на такого актера, должен послать супервизору сообщение «закрыть сеанс», чтобы освободить актера, когда он ему больше не нужен (это делается прозрачно. одноразовым объектом "ActorSession"). Пока с актером есть открытые сеансы, супервизор не удалит его.
Я полагаю, что эта ситуация довольно распространена, и поэтому мне интересно, нет ли более простого шаблона для решения этой проблемы. Любое предложение будет оценено.