J'essaie de créer un exemple qui crée un cluster capable de traiter un ordre et un client qui envoie un ordre. Pour ce faire, j'utilise ClusterClientReceptionist et ClusterClient pour communiquer entre un client et un réseau de clusters.Akka.Net ClusterClientReceptionist crash multinode
Cluster Code Node:
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;
}
}
}
code côté client:
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;
}
}
}
Lorsque je crée un nœud de cluster et un client le travail de l'échantillon. Si j'essaie de créer plusieurs nœuds de cluster, ils se connectent les uns aux autres puis se dissocient directement et le cluster est réduit.
Si je commente les deux lignes suivantes, le cluster fonctionne mais le mécanisme Réceptionniste/Client ne fonctionne pas.
var receptionist = ClusterClientReceptionist.Get(system);
receptionist.RegisterService(aref);
Leur configuration manquante?
Merci beaucoup. Par ailleurs, il fonctionne avec Akka.Serialization.Hyperion aussi. –