注文を処理できるクラスタと注文を送信するクライアントを作成するサンプルを作成しようとしています。Akka.Net ClusterClientReceptionistマルチノードクラッシュ
これを行うには、ClusterClientReceptionistとClusterClientを使用して、クライアントとクラスタネットワーク間で通信します。
クラスタノードコード:
namespace ClusterNode
{
class Program
{
static void Main(string[] args)
{
bool isFirst = false;
using (var mutex = new Mutex(false, "5D14E338-616C-4637-93E7-E59D152DC005", out isFirst))
{
using (var system = ActorSystem.Create(nameof(Order), CreateConfig(isFirst)))
{
var receptionistConfig = ClusterClientReceptionist.DefaultConfig();
system.Settings.InjectTopLevelFallback(receptionistConfig);
ClusterRouterPoolSettings settings = new ClusterRouterPoolSettings(int.MaxValue, 1, true);
ClusterRouterPool pool = new ClusterRouterPool(new Akka.Routing.RoundRobinPool(1), settings);
var aref = system.ActorOf(pool.Props(Props.Create<OrderProcessor>()), nameof(OrderProcessor));
var receptionist = ClusterClientReceptionist.Get(system);
receptionist.RegisterService(aref);
system.WhenTerminated.Wait();
}
}
}
private static Config CreateConfig(bool isFirst)
{
var configString = "akka { actor.provider = \"Akka.Cluster.ClusterActorRefProvider, Akka.Cluster\"\n";
var port = (isFirst) ? 8082 : 0;
configString += "remote { helios.tcp { hostname = localhost, port = " + port + " } }\n";
configString += "cluster {\n seed-nodes = [\"akka.tcp://" + nameof(Order) + "@localhost:8082\"] \n";
configString += "}\n";
configString += "}";
var config = ConfigurationFactory.ParseString(configString);
return config;
}
}
}
クライアント側コード:
namespace Client
{
class Program
{
static void Main(string[] args)
{
using (var system = ActorSystem.Create(nameof(Client), CreateConfig()))
{
system.Settings.InjectTopLevelFallback(ClusterClientReceptionist.DefaultConfig());
var client = system.ActorOf(ClusterClient.Props(ClusterClientSettings.Create(system)));
bool quit = false;
while (!quit)
{
var str = Console.ReadLine();
if (string.Equals(str, "QUIT", StringComparison.InvariantCultureIgnoreCase))
{
quit = true;
continue;
}
Order order = new Order() { Msg = str };
var respTask = client.Ask<Response>(new ClusterClient.Send("/user/OrderProcessor", order));
respTask.Wait();
Console.WriteLine(respTask.Result.ResponseMsg);
}
system.Terminate();
system.WhenTerminated.Wait();
}
}
private static Config CreateConfig()
{
var configString = "akka { actor.provider = \"Akka.Remote.RemoteActorRefProvider, Akka.Remote\"\n";
configString += "remote { helios.tcp { hostname = localhost, port = 0 } }\n";
configString += "cluster {\n seed-nodes = [\"akka.tcp://" + nameof(Order) + "@localhost:8082\"], ";
configString += " client { initial-contacts : [ \"akka.tcp://" + nameof(Order) + "@localhost:8082/system/receptionist\" ] }";
configString += " }\n";
configString += "}";
var config = ConfigurationFactory.ParseString(configString);
return config;
}
}
}
私は1つのクラスタノードと1つのクライアントのサンプルワークを作成します。 私は複数のクラスタノードを作成しようとすると、それらはお互いに接続し、直接dissociateし、クラスタは崩壊しました。
もし私が2つのフォールリング・ラインにコメントすると、クラスタは動作しますが、Receptionist/Clientの仕組みは動作しません。
var receptionist = ClusterClientReceptionist.Get(system);
receptionist.RegisterService(aref);
設定が不足していますか?
おかげでたくさんの中で使用されて見ることができます。ところで、Akka.Serialization.Hyperionでも動作します。 –