如何将 Akka.NET 远程处理解决方案拆分为两个解决方案?
How to split Akka.NET remoting solution to two solutions?
我已经制定了 2 Akka.NET 解决方案,希望在一个简单的 hello world 示例中测试远程处理,但是,在进行通信尝试时,我总是收到 Disassociated 异常。我有理由相信这是因为共享的 class Greet 应该是两个系统都应该理解的消息。不幸的是,他们没有。我怎样才能解决这个问题?
这是 "Server" 应用程序的代码:
namespace Shared
{
public class Greet
{
public string Who { get; set; }
public Greet(string who)
{
Who = who;
}
}
}
namespace AkkaTest
{
using Shared;
class GreeterActor : ReceiveActor
{
public GreeterActor()
{
Receive<Greet>(x => Console.WriteLine("Hello {0}", x.Who));
}
}
class Program
{
static void Main(string[] args)
{
var config = ConfigurationFactory.ParseString(@"
akka {
actor.provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
remote {
helios.tcp {
port = 9099
hostname = 127.0.0.1
}
}
}
");
using (ActorSystem system = ActorSystem.Create("MyServer", config))
{
system.ActorOf<GreeterActor>("greeter");
Console.ReadLine();
system.Shutdown();
}
}
}
}
这是客户端的代码:
namespace Shared
{
public class Greet
{
public string Who { get; set; }
public Greet(string who)
{
Who = who;
}
}
}
namespace AkkaTest
{
using Shared;
class Program
{
static void Main(string[] args)
{
var config = ConfigurationFactory.ParseString(@"
akka {
actor.provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
remote {
helios.tcp {
port = 9090
hostname = 127.0.0.1
}
}
}
");
using (var system = ActorSystem.Create("MyClient", config))
{
//get a reference to the remote actor
var greeter = system
.ActorSelection("akka.tcp://MyServer@127.0.0.1:9099/user/greeter");
//send a message to the remote actor
greeter.Tell(new Greet("Roger"));
Console.ReadLine();
}
}
}
}
编辑:将客户端和服务器放在同一个解决方案但不同的项目中,并将 GreetingActor 和 Greet 放在共享项目中修复了这些问题。但是,我想要完全独立的解决方案。
如果您在双方都使用 Greet
消息,则需要提供某种方式在它们之间共享此消息架构。通常这是作为在其他项目或解决方案之间共享的单独项目来完成的。
虽然默认 Akka.NET 序列化程序使用完全限定的类型名称和组装到 serialize/deserialize 消息,但它也是版本容错的 - 您可以修改消息架构并逐节点逐步更新它的程序集。
其他选项是使用自定义序列化程序。这样您就可以自己确定消息在两端的 serialized/deserialized 是怎样的。您可以阅读有关此主题的更多信息 here。
我已经制定了 2 Akka.NET 解决方案,希望在一个简单的 hello world 示例中测试远程处理,但是,在进行通信尝试时,我总是收到 Disassociated 异常。我有理由相信这是因为共享的 class Greet 应该是两个系统都应该理解的消息。不幸的是,他们没有。我怎样才能解决这个问题?
这是 "Server" 应用程序的代码:
namespace Shared
{
public class Greet
{
public string Who { get; set; }
public Greet(string who)
{
Who = who;
}
}
}
namespace AkkaTest
{
using Shared;
class GreeterActor : ReceiveActor
{
public GreeterActor()
{
Receive<Greet>(x => Console.WriteLine("Hello {0}", x.Who));
}
}
class Program
{
static void Main(string[] args)
{
var config = ConfigurationFactory.ParseString(@"
akka {
actor.provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
remote {
helios.tcp {
port = 9099
hostname = 127.0.0.1
}
}
}
");
using (ActorSystem system = ActorSystem.Create("MyServer", config))
{
system.ActorOf<GreeterActor>("greeter");
Console.ReadLine();
system.Shutdown();
}
}
}
}
这是客户端的代码:
namespace Shared
{
public class Greet
{
public string Who { get; set; }
public Greet(string who)
{
Who = who;
}
}
}
namespace AkkaTest
{
using Shared;
class Program
{
static void Main(string[] args)
{
var config = ConfigurationFactory.ParseString(@"
akka {
actor.provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
remote {
helios.tcp {
port = 9090
hostname = 127.0.0.1
}
}
}
");
using (var system = ActorSystem.Create("MyClient", config))
{
//get a reference to the remote actor
var greeter = system
.ActorSelection("akka.tcp://MyServer@127.0.0.1:9099/user/greeter");
//send a message to the remote actor
greeter.Tell(new Greet("Roger"));
Console.ReadLine();
}
}
}
}
编辑:将客户端和服务器放在同一个解决方案但不同的项目中,并将 GreetingActor 和 Greet 放在共享项目中修复了这些问题。但是,我想要完全独立的解决方案。
如果您在双方都使用 Greet
消息,则需要提供某种方式在它们之间共享此消息架构。通常这是作为在其他项目或解决方案之间共享的单独项目来完成的。
虽然默认 Akka.NET 序列化程序使用完全限定的类型名称和组装到 serialize/deserialize 消息,但它也是版本容错的 - 您可以修改消息架构并逐节点逐步更新它的程序集。
其他选项是使用自定义序列化程序。这样您就可以自己确定消息在两端的 serialized/deserialized 是怎样的。您可以阅读有关此主题的更多信息 here。