저는 지난 2 일 동안 Azure 작업자 역할에 기본 콘솔 응용 프로그램을 배포하는 방법을 정확히 파악하려고 애를 썼습니다. 클라이언트 기반 응용 프로그램에서 원격으로 액세스 할 수 있어야합니다. MVC 웹 응용 프로그램. 아래 답변Azure 작업자 역할 (AKKA.NET)에서 원격 작업자 구성을 구성하는 방법
1
A
답변
2
내 MVC 응용 프로그램이 통신하고있는 로컬 콘솔 응용 프로그램에 내 액터 상태가 포함되어 시작했습니다. 나는 Azure 생태계로 애플리케이션을 배치하고 싶었고, 애플리케이션 서비스에서 호스팅되는 생각 "클라이언트"MVC 애플리케이션을 사용하여 상태를 근로자 역할 내에서 유지하는 것이 최선의 방법이라고 생각했습니다.
액터 시스템이 자신의 프로젝트에 솔루션에서 추출되었는지 확인하십시오. 솔루션 내에서 Worker 역할 CloudService 프로젝트를 새로 작성하십시오. 다음과 같이
내 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를 그리고 포트 이전에 구성한를 통해
, 당신은 포트가 서버에 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 시스템없이)를 설명하는 많은 문서를 실제로 찾지 못했습니다. 내가 어떤 식 으로든 대답을 향상시킬 수 있는지 알려 주시기 바랍니다.