Подтвердить что ты не робот

Акторская система Akka.NET в ASP.NET

Я создал службу с RESTful API в ASP.NET, размещенную в IIS. Внутри этой службы я хотел бы создать актерскую систему с Akka.NET.

Создав актерскую систему:

var actorSystem = ActorSystem.Create("myActorSystem");

Вызывается следующее исключение:

В System.Web.dll произошла первая случайная ошибка типа "System.InvalidOperationException" Дополнительная информация: асинхронная операция не может быть запущена в это время. Асинхронные операции могут запускаться только в асинхронном обработчике или модуле или во время определенных событий в жизненном цикле страницы. Если это исключение произошло во время выполнения страницы, убедитесь, что страница отмечена <% @Page Async = "true" % > . Это исключение может также указывать на попытку вызвать метод async void, который обычно не поддерживается в обработке запросов ASP.NET. Вместо этого асинхронный метод должен возвращать задачу, и вызывающий должен ее ожидать.

Актер-система по своей сути является параллельной системой с обменом асинхронными сообщениями между участниками. Как объяснялось здесь, эта система актеров не выдержит IIS, снимая AppDomain, что, вероятно, и связано с тем, что вызывается вышеупомянутое исключение.

В этой статье объясняется, как выполнять фоновые задачи в ASP.NET. Тем не менее, я не вижу, как я мог бы использовать это для своей действующей системы, поскольку у меня нет контроля над жизненным циклом фоновых задач, которые могут быть созданы Akka.NET.

Есть ли способ сделать эту работу, или я должен отказаться от идеи наличия актерской системы в приложении ASP.NET?

EDIT: Я также видел вопрос о Stackoverflow о внедрении службы REST с использованием Akka. Любые советы относительно решения, аналогичного Spray toolkit, но работа для Akka.NET будет приветствоваться.

4b9b3361

Ответ 1

Храните свою ActorSystem в качестве общего свойства в каком-либо контейнере статического класса - таким образом вы можете получить к ней доступ из остальной части вашего приложения. Инициализация/удаление системы актера может быть выполнена:

  • Global.asax - используйте ActorSystem.Create(...) внутри Global.asax Application_Start и удалите его с помощью system.Shutdown() на Application_End.
  • OWIN - создайте актерскую систему в OWIN Startup.Configuration и закройте ее привязкой к событию host.OnAppDisposing(как).

Помните, что IIS запустит ваше веб-приложение только после первого запроса и автоматически отторжит его после некоторого времени, когда он простаивает. Поэтому убедитесь, что ваше развертывание script будет запускать приложение после публикации и установить тайм-аут простоя (ссылка) достаточно долго, если вы хотите, чтобы ваш Akka чтобы система работала непрерывно.

Второй вариант

Отделите свою логику системы Actor и разверните ее, например, в качестве службы Windows (или Linux deamon). Включите Akka.Remoting для него и создайте прокси-клиент, который будет перенаправлять все приложения на длительные сложные задачи на внешнюю службу. Подобное решение часто используется для таких вещей, как планировщики или шины событий, когда ваша прикладная логика должна работать непрерывно.

Ответ 2

Я использовал Akka.NET и Akka.Remote внутри приложений ASP.NET MVC, которые делают до 1000 запросов в секунду на EC2, поэтому я поделюсь некоторыми советами и трюками, которые я использовал для его создания, и успешно работает. Имел прототип версии, которая даже использовала Akka.Cluster, но в итоге не отправила эту версию.

  • Лучшее место для вызова ActorSystem.Create находится внутри Global.asax Application_Start().
  • Возьмите статическую ссылку на объект ActorSystem внутри самого Global.asax, используя статическое поле или свойство. Помогает гарантировать, что сам ActorSystem не получает сбор мусора в давно работающих приложениях.
  • Создайте отдельный статический вспомогательный класс для инициализации любых игроков верхнего уровня, которые нужны вашим приложениям, т.е. актеров в верхней части иерархии /user/. Этот класс должен также предоставлять пути к действию, которые могут использовать ваши контроллеры ASP.MVC и методы действий для операций Tell и Ask.

Создание ActorSystem - это довольно дорогостоящая операция, потому что сразу же запускается много материалов на системном уровне. Это определенно лучше сделать это один раз при запуске приложения, а затем просто кэшировать результат внутри класса Application.

Создание отдельных экземпляров актеров дешево - вы должны иметь возможность сделать это без проблем внутри методов действий ASP.NET MVC. Если вы снова видите эту ошибку, сообщите нам, какая часть процесса обработки запроса произошла и с какой версией ASP.NET.