如何在 Azure 工作者角色中配置远程参与者配置 (AKKA.NET)
How to configure a remote actor configuration in an Azure worker role (AKKA.NET)
过去 2 天我一直在苦苦思索如何将基本控制台应用程序部署到 Azure 工作者角色中,并使其可以从某种基于客户端的应用程序(例如MVC 网络应用程序。下面回答
我首先将我的 Actor 状态包含在与我的 MVC 应用程序通信的本地控制台应用程序中。我希望使用 Azure 生态系统部署我的应用程序,并认为在辅助角色中维护状态,认为 "client" MVC 应用程序托管在应用程序服务中将是最好的前进方式。
确保您的 Actor 系统从您的解决方案中提取到它自己的项目中。在您的解决方案中创建一个新的辅助角色 CloudService 项目。
Select 工人角色
我按如下方式配置了我的 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);
}
}
}
而我的HOCON文件(app.config内)如下:
<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>
我们需要在工作者角色配置中定义我们的端点,以便我们 "expose" 一个我们可以与外界通信的端口。因此,转到您的 WorkerRole 设置。
部署辅助角色后,您应该能够确认端口已打开并可用,方法是通过服务器的 IP 和您之前配置的端口远程登录到服务器。
从我们的客户端设置我们的 ActorSelection 最重要的部分是下面的 IP/DNS 地址必须与 public 中设置的 IP/DNS- worker 角色中 HOCON 配置中的主机名设置
ActorReferences.GameController =
ActorSystem.ActorSelection("akka.tcp://GameSystem@xx.xxx.xxx.xxx:8091/user/GameController")
.ResolveOne(TimeSpan.FromSeconds(3))
.Result;
为完整起见,这是我的客户端 HOCON 配置:
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"
}
}
}
我真的希望这能帮助其他人。我真的没有找到太多描述 Akka.NET 部署到 Azure 的文档(没有将 Actor 系统部署到不稳定的 IIS 应用程序服务)。如果我能以任何方式改进答案,请告诉我。
过去 2 天我一直在苦苦思索如何将基本控制台应用程序部署到 Azure 工作者角色中,并使其可以从某种基于客户端的应用程序(例如MVC 网络应用程序。下面回答
我首先将我的 Actor 状态包含在与我的 MVC 应用程序通信的本地控制台应用程序中。我希望使用 Azure 生态系统部署我的应用程序,并认为在辅助角色中维护状态,认为 "client" MVC 应用程序托管在应用程序服务中将是最好的前进方式。
确保您的 Actor 系统从您的解决方案中提取到它自己的项目中。在您的解决方案中创建一个新的辅助角色 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);
}
}
}
而我的HOCON文件(app.config内)如下:
<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>
我们需要在工作者角色配置中定义我们的端点,以便我们 "expose" 一个我们可以与外界通信的端口。因此,转到您的 WorkerRole 设置。
部署辅助角色后,您应该能够确认端口已打开并可用,方法是通过服务器的 IP 和您之前配置的端口远程登录到服务器。
从我们的客户端设置我们的 ActorSelection 最重要的部分是下面的 IP/DNS 地址必须与 public 中设置的 IP/DNS- worker 角色中 HOCON 配置中的主机名设置
ActorReferences.GameController =
ActorSystem.ActorSelection("akka.tcp://GameSystem@xx.xxx.xxx.xxx:8091/user/GameController")
.ResolveOne(TimeSpan.FromSeconds(3))
.Result;
为完整起见,这是我的客户端 HOCON 配置:
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"
}
}
}
我真的希望这能帮助其他人。我真的没有找到太多描述 Akka.NET 部署到 Azure 的文档(没有将 Actor 系统部署到不稳定的 IIS 应用程序服务)。如果我能以任何方式改进答案,请告诉我。