2014-12-24 3 views
13

IIS에서 호스팅되는 ASP.NET에서 RESTful API를 사용하여 서비스를 만들었습니다. 이 서비스에서는 Akka.NET을 사용하여 배우 시스템을 만들고 싶습니다. 다음의 예외가 발생ASP.NET의 Akka.NET 액터 시스템

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

:

'System.InvalidOperationException'형식의 첫째 예외가 추가 정보를 System.Web.dll 발생 액터 시스템을 구축하면

: 현재 비동기 작업을 시작할 수 없습니다. 비동기 작업은 비동기 처리기 또는 모듈 내에서만 또는 페이지 수명주기의 특정 이벤트 중에 시작될 수 있습니다. 페이지를 실행하는 동안이 예외가 발생하면 페이지가 < % @ Page Async = "true"%>로 표시되는지 확인하십시오. 이 예외는 ASP.NET 요청 처리 내에서 일반적으로 지원되지 않는 "비동기 void"메서드를 호출하려는 시도를 나타낼 수도 있습니다. 대신 비동기 메서드는 Task를 반환해야하며 호출자는이를 기다려야합니다.

배우 시스템은 본질적으로 액터간에 비동기 메시지가 교환되는 동시 시스템입니다. 설명 된 바와 같이 here,이 액터 시스템은 IIS가 AppDomain을 사용하는 것을 견디지 못합니다. 아마도 앞서 언급 한 예외가 발생했을 것입니다.

This article은 ASP.NET에서 백그라운드 작업을 실행하는 방법을 설명합니다. 그러나 Akka.NET에서 생성 된 백그라운드 작업의 수명주기를 제어 할 수 없기 때문에이 방법을 액터 시스템에 사용하는 방법을 알 수 없습니다.

이 방법을 사용할 수 있습니까? 아니면 ASP.NET 응용 프로그램에서 배우 시스템을 사용한다는 아이디어를 포기해야합니까?

편집 : 나는 또한 implementing a REST service using Akka에 대한 Stackoverflow에 대한 질문을 보았다. Spray toolkit과 비슷한 솔루션에 대한 조언은 있지만 Akka.NET에서 일하는 것은 환영 할만한 일입니다.

+1

배우 모델의 소리가 멋지다. 하지만 정말로 필요하니? – odinserj

+1

나는 이것을 개념 증명으로 시험하고 있는데, 나는 절대적으로 필요하지 않다. 결론은 너무 복잡 할 수 있다는 것입니다. – Odsh

답변

22

일부 정적 클래스 컨테이너에서 ActorSystem을 공유 속성으로 유지하십시오. 그러면 나머지 응용 프로그램에서 ActorSystem에 액세스 할 수 있습니다. Global.asax에 Application_Start 내부 ActorSystem.Create(...)을 사용하고 Application_Endsystem.Shutdown()와 함께 폐기 -

  • Global.asax에 : 배우의 시스템 초기화/처분하여 수행 할 수 있습니다.
  • OWIN - OWIN의 Startup.Configuration 방법에 배우 시스템을 만들고 host.OnAppDisposing 이벤트 (how-to link)에 결합하여 종료합니다.

IIS는 처음 요청한 후에 만 ​​웹 응용 프로그램을 시작하고 유휴 상태 일 때 자동으로 컴퓨터를 종료합니다. 따라서 퍼블리싱 후 배포 스크립트가 ping 응용 프로그램을 실행하고 Akka 배우 시스템을 계속 실행하려면 유휴 시간 제한 (link)을 길게 설정해야합니다.

두 번째 옵션

분리하여 배우의 시스템 로직 및 Windows 서비스 (또는 리눅스 데몬)로, 예를 들어, 배포 할 수 있습니다. Akka.Remoting을 켜고 프록시 클라이언트를 생성합니다. 프록시 클라이언트는 장기간 실행되는 모든 응용 프로그램을 외부 서비스로 전달합니다. 응용 프로그램 논리가 지속적으로 작동해야하는 경우 스케줄러 또는 이벤트 버스와 같은 솔루션에 자주 사용됩니다.

+0

답장 Horusiath 주셔서 감사합니다. 나는 두 번째 옵션으로 갈 필요가 있다고 생각한다. 배우 시스템이 잠재적으로 매우 길거나 연속적인 작업을 수행 할 수 있기 때문에 첫 번째는 제 경우에는 적용하기가 어렵습니다. – Odsh

25

저는 EC2에서 초당 1000 건의 요청을 처리하는 ASP.NET MVC 응용 프로그램에서 Akka.NET 및 Akka.Remote를 사용했습니다. 그래서 얻으려는 요령과 요령을 몇 가지 알려 드리겠습니다. 성공적으로 실행됩니다. Akka.Cluster를 사용한 프로토 타입 버전이 있었지만 그 버전을 제공하지 못했습니다.

  • ActorSystem.Create을 호출하는 최적의 장소는 Global.asax Application_Start()입니다.
  • 정적 필드 또는 속성을 사용하여 Global.asax 자체 내부의 ActorSystem 개체에 대한 정적 참조를 정지시킵니다. ActorSystem 자체가 장기 실행 응용 프로그램에서 가비지 수집되지 않도록합니다.
  • 애플리케이션에 필요한 최상위 액터 (즉, /user/ 계층의 맨 위에있는 액터)를 초기화하는 별도의 정적 도우미 클래스를 만듭니다. 이 클래스는 ASP.MVC 컨트롤러 및 작업 메서드에서 TellAsk 작업에 사용할 수있는 액터 경로도 제공해야합니다.

ActorSystem을 만드는 작업은 시스템 수준의 많은 작업이 한꺼번에 실행되기 때문에 비용이 많이 드는 작업입니다. 응용 프로그램 시작시이 작업을 한 번 수행 한 다음 결과를 Application 클래스에 캐시하는 것이 가장 좋습니다.

개별 액터 인스턴스를 만드는 것이 저렴합니다. ASP.NET MVC 작업 메서드 내에서 아무런 문제없이이 작업을 수행 할 수 있어야합니다. 이 오류가 다시 나타나면이 오류가 발생한 요청 처리 프로세스의 어떤 부분과 ASP.NET의 버전을 알려주십시오.

+0

답장을 보내 주셔서 감사합니다. [이 사이트] (http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/)에서 설명한 것처럼 ASP .NET은 AppDomain을 언제든지 파괴 할 수 있으므로 응용 프로그램에서 백그라운드 실행을 중단시킬 수 있습니다. 무슨 일이 일어나면 배우 시스템에 어떤 일이 생길까요? – Odsh

+0

이 모든 시나리오에서 Akka.NET은 ASP.NET AppDomain에서 실행됩니다. 따라서 Haack 윤곽선 시나리오의 경우 웹 응용 프로그램이 액터 시스템과 함께 재활용됩니다 (web.config 편집, IIS 프로세스 재활용 , etc ...) 호스팅 환경에 따라 IIS 및 machine.config 설정을 통해 이들 모두를 제어 할 수 있습니다. 그럼에도 불구하고, ActorSystem은 여전히 ​​웹 애플리케이션과 동시에 활성화 될 것입니다. ActorSystem을 완전히 없애고 ASP.NET 애플리케이션을 그대로 둡니다. – Aaronontheweb

+0

배우 시스템이 내 웹 응용 프로그램과 동시에 활성화됩니다. 예. 제가 피하고 싶은 것은이 액터 시스템이 여전히 액티브 한 액터와 비어 있지 않은 메시지 큐를 가지고 재사용시 경고없이 멈추는 것입니다. – Odsh

관련 문제