2017-10-13 12 views

답변

2

내 MVC 응용 프로그램이 통신하고있는 로컬 콘솔 응용 프로그램에 내 액터 상태가 포함되어 시작했습니다. 나는 Azure 생태계로 애플리케이션을 배치하고 싶었고, 애플리케이션 서비스에서 호스팅되는 생각 "클라이언트"MVC 애플리케이션을 사용하여 상태를 근로자 역할 내에서 유지하는 것이 최선의 방법이라고 생각했습니다.

액터 시스템이 자신의 프로젝트에 솔루션에서 추출되었는지 확인하십시오. 솔루션 내에서 Worker 역할 CloudService 프로젝트를 새로 작성하십시오. 다음과 같이

Azure Cloud Service Project Make sure you select worker role 선택 근무 역할

내 WorkRole 구성 :

public class WorkerRole : RoleEntryPoint 
{ 
    private readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); 
    private readonly ManualResetEvent runCompleteEvent = new ManualResetEvent(false); 
    private static ActorSystem ActorSystemInstance; 
    public override void Run() 
    { 
     Trace.TraceInformation("Game.State.WorkerRole is running"); 

     try 
     { 
      this.RunAsync(this.cancellationTokenSource.Token).Wait(); 
     } 
     finally 
     { 
      this.runCompleteEvent.Set(); 
     } 
    } 

    public override bool OnStart() 
    {                     
     ActorSystemInstance = ActorSystem.Create("GameSystem");    
     // Set the maximum number of concurrent connections 
     ServicePointManager.DefaultConnectionLimit = 12; 

     // For information on handling configuration changes 
     // see the MSDN topic at https://go.microsoft.com/fwlink/?LinkId=166357. 

     bool result = base.OnStart(); 

     Trace.TraceInformation("Game.State.WorkerRole has been started"); 

     return result; 
    } 

    public override void OnStop() 
    { 
     ActorSystemInstance.Terminate(); 
     Trace.TraceInformation("Game.State.WorkerRole is stopping"); 

     this.cancellationTokenSource.Cancel(); 
     this.runCompleteEvent.WaitOne(); 

     base.OnStop(); 

     Trace.TraceInformation("Game.State.WorkerRole has stopped"); 
    } 

    private async Task RunAsync(CancellationToken cancellationToken) 
    { 
     var gameController = ActorSystemInstance.ActorOf<GameControllerActor>("GameController"); 

     while (!cancellationToken.IsCancellationRequested) 
     { 
      Trace.TraceInformation("Working"); 
      await Task.Delay(1000); 
     } 
    } 
} 

그리고합니다 (의 app.config 이내) 내 HOCON 파일을 다음과 같이

<akka> 
<hocon> 
    <![CDATA[ 
    akka { 
    loglevel = DEBUG 

    actor { 
     provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote" 
     debug { 
     receive = on 
     autoreceive = on 
     lifecycle = on 
     event-stream = on 
     unhandled = on 
     } 
    } 


    remote { 
     helios.tcp { 
     transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote" 
     transport-protocol = tcp 
     enforce-ip-family = true 
     port = xxxx //the port configured in your worker role endpoint 
     hostname = "0.0.0.0" //This is the local hostname of the worker role, using 0.0.0.0 will set the Remote actor to "listen" on all available DNS/IP addresses including the loopback (127.0.0.1) 
     pulic-hostname = "xx.xx.xx.xx" //IP Address OR DNS name, but whatever is set here is what MUST be used in the Actor Selector path on the client in order for proper "association" to occur. I did find that DNS name was required for my application as I was using SignalR as a bridge between the Actor system and the web client. 

     } 
    } 
    } 
    ]]> 
</hocon> 

외부 세계와 통신 할 수있는 포트를 "노출"할 수 있도록 작업자 역할 구성 내에서 엔드 포인트를 정의해야합니다. WorkerRole 설정으로 이동하십시오. 작업자의 역할이 배포되면이 IP를 그리고 포트 이전에 구성한를 통해

Endpoint Configuration

, 당신은 포트가 서버에 telnet'ing로 개방하고 사용할 수 있는지 확인 할 수 있어야한다.

우리의 클라이언트에서 우리의 ActorSelection 설정에 가장 중요한 부분은 아래의 IP/DNS 주소가 작업자 역할

ActorReferences.GameController = 
      ActorSystem.ActorSelection("akka.tcp://[email protected]:8091/user/GameController") 
       .ResolveOne(TimeSpan.FromSeconds(3)) 
       .Result; 
내 HOCON의 설정에 공개 호스트 설정에서 설정 한 IP/DNS와 일치해야한다는 것입니다 난 정말이 다른 거기에 사람을 도움이되기를 바랍니다

akka { 
    loglevel = OFF 

    actor { 
     provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote" 
     debug { 
     receive = on 
     autoreceive = on 
     lifecycle = on 
     event-stream = on 
     unhandled = on 
     } 
    } 


    remote { 
     helios.tcp { 
     transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote" 
     transport-protocol = tcp 
     enforce-ip-family = true 
     port = 0 //A port will be provided for us... not important as we won't be calling into the client externally 
     public-hostname = "yoursitename.azurewebsites.net" //Remember this is simply the DNS name of the client machine 
     hostname = "127.0.0.1" 
     } 
    } 
    } 

: 완성도를 들어

여기 내 클라이언트 HOCON의 설정입니다. Azure에 대한 Akka.NET 배치 (휘발성 IIS 응용 프로그램 서비스에 배포 된 Actor 시스템없이)를 설명하는 많은 문서를 실제로 찾지 못했습니다. 내가 어떤 식 으로든 대답을 향상시킬 수 있는지 알려 주시기 바랍니다.