/// <summary> /// Creates a cluster client, that allows to connect to cluster even thou current actor system is not part of it. /// </summary> static void RunClusterClient(ActorSystem system) { //NOTE: to properly run cluster client set up actor ref provider for nodes on `provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote"` system.Settings.InjectTopLevelFallback(ClusterClientReceptionist.DefaultConfig()); var clusterClient = system.ActorOf(ClusterClient.Props(ClusterClientSettings.Create(system))); clusterClient.Tell(new ClusterClient.Send("/user/my-service", new Echo("hello from cluster client"))); }
public ClusterClientSpecConfig() { Client = Role("client"); First = Role("first"); Second = Role("second"); Third = Role("third"); Fourth = Role("fourth"); CommonConfig = ConfigurationFactory.ParseString(@" akka.loglevel = DEBUG akka.testconductor.query-timeout = 1m # we were having timeouts shutting down nodes with 5s default akka.actor.provider = cluster akka.remote.log-remote-lifecycle-events = off akka.cluster.auto-down-unreachable-after = 0s akka.cluster.client.heartbeat-interval = 1s akka.cluster.client.acceptable-heartbeat-pause = 3s akka.cluster.client.refresh-contacts-interval = 1s # number-of-contacts must be >= 4 because we shutdown all but one in the end akka.cluster.client.receptionist.number-of-contacts = 4 akka.cluster.client.receptionist.heartbeat-interval = 10s akka.cluster.client.receptionist.acceptable-heartbeat-pause = 10s akka.cluster.client.receptionist.failure-detection-interval = 1s akka.test.filter-leeway = 10s ") .WithFallback(ClusterClientReceptionist.DefaultConfig()) .WithFallback(DistributedPubSub.DefaultConfig()); TestTransport = true; }
public static ActorSystem Launch() { var systemName = string.Empty; var ipAddress = string.Empty; var clusterConfig = ConfigurationFactory.ParseString(File.ReadAllText("akka.hocon")); var myConfig = clusterConfig.GetConfig("myactorsystem"); systemName = myConfig.GetString("actorsystem", systemName); var remoteConfig = clusterConfig.GetConfig("akka.remote"); ipAddress = remoteConfig.GetString("dot-netty.tcp.public-hostname") ?? "127.0.0.1"; //localhost as a final default int port = remoteConfig.GetInt("dot-netty.tcp.port"); var selfAddress = $"akka.tcp://{systemName}@{ipAddress}:{port}"; /* * Sanity check */ Console.WriteLine($"ActorSystem: {systemName}; IP: {ipAddress}; PORT: {port}"); Console.WriteLine("Performing pre-boot sanity check. Should be able to parse address [{0}]", selfAddress); selfAddress = new Address("akka.tcp", systemName, ipAddress.Trim(), port).ToString(); Console.WriteLine("Parse successful."); var clusterSeeds = Environment.GetEnvironmentVariable("CLUSTER_SEEDS")?.Trim(); var seeds = clusterConfig.GetStringList("akka.cluster.seed-nodes"); if (!string.IsNullOrEmpty(clusterSeeds)) { var tempSeeds = clusterSeeds.Trim('[', ']').Split(','); if (tempSeeds.Any()) { seeds = tempSeeds; } } if (!seeds.Contains(selfAddress)) { seeds.Add(selfAddress); } var injectedClusterConfigString = seeds.Aggregate("akka.cluster.seed-nodes = [", (current, seed) => current + (@"""" + seed + @""", ")); injectedClusterConfigString += "]"; var finalConfig = ConfigurationFactory.ParseString( string.Format(@"akka.remote.dot-netty.tcp.public-hostname = {0} akka.remote.dot-netty.tcp.port = {1}", ipAddress, port)) .WithFallback(ConfigurationFactory.ParseString(injectedClusterConfigString)) .WithFallback(clusterConfig); return(ActorSystem.Create(systemName, finalConfig .WithFallback(ClusterClientReceptionist.DefaultConfig()) .WithFallback(Akka.Cluster.Tools.PublishSubscribe.DistributedPubSub.DefaultConfig()))); }
public void Start() { var system = ActorSystem.Create(Constants.ActorSystemName, ConfigurationFactory.Load().WithFallback(ClusterSingletonManager.DefaultConfig())); system.Settings.InjectTopLevelFallback(ClusterClientReceptionist.DefaultConfig()); var settings = ClusterClientSettings.Create(system); var client = system.ActorOf(ClusterClient.Props(settings), clientName); while (!shouldStop) { Console.WriteLine("Press key to send message"); Console.ReadKey(); client.Ask <ShardEnvelope>(new ClusterClient.Send("/user/sharding/MyActor", new ShardEnvelope(envelopeId, SendMessage) { FromClientId = clientId }), TimeSpan.FromSeconds(10)) .ContinueWith(se => { if (se.Status == TaskStatus.Canceled) { Logger.Warn("He ignored me:("); } else { Logger.Info($"Received response with EntityId: {se.Result.EntityId}, Message: {se.Result.Message}, from NodeId: {se.Result.FromNodeId}"); } }); } }
public static Config BoostrapApplication(this Config c, AppBootstrapConfig appConfig) { var config = c; if (appConfig.NeedPersistence) { var mongoConnectionString = Environment.GetEnvironmentVariable("MONGO_CONNECTION_STR")?.Trim(); if (string.IsNullOrEmpty(mongoConnectionString)) { Console.WriteLine("ERROR! MongoDb connection string not provided. Can't start."); throw new ConfigurationException("ERROR! MongoDb connection string not provided. Can't start."); } else { Console.WriteLine("Connecting to MongoDb at {0}", mongoConnectionString); } config = c.WithFallback(GetMongoHocon(mongoConnectionString)); } config = config .WithFallback(GetOpsConfig()) .WithFallback(TradeEventSerializer.Config) .WithFallback(ClusterSharding.DefaultConfig()) .WithFallback(DistributedData.DistributedData.DefaultConfig()) // needed for DData sharding .WithFallback(ClusterClientReceptionist.DefaultConfig()) .WithFallback(DistributedPubSub.DefaultConfig()) .BootstrapFromDocker(); #if PHOBOS return(config.BootstrapPhobos(appConfig)); #else if (!appConfig.NeedClustering) { return(ConfigurationFactory.ParseString("akka.actor.provider = remote").WithFallback(config)); } return(config); #endif }
public async Task StartAsync() { var setup = ActorSystemSetup.Create( BootstrapSetup.Create() .WithConfig(Util.Config(_port)) .WithConfigFallback(DistributedPubSub.DefaultConfig()) .WithConfigFallback(ClusterClientReceptionist.DefaultConfig()) .WithActorRefProvider(ProviderSelection.Cluster.Instance)); _actorSystem = ActorSystem.Create(Consts.NodeName, setup); var cluster = Akka.Cluster.Cluster.Get(_actorSystem); await cluster.JoinSeedNodesAsync(Consts.Seeds); _receptionist = ClusterClientReceptionist.Get(_actorSystem); foreach (var id in Enumerable.Range(_nodeId * Consts.ActorCount, Consts.ActorCount)) { var actor = _actorSystem.ActorOf(Props.Create(() => new ServiceActor(id)), Util.ActorName(id)); _receptionist.RegisterService(actor); } }
public ClusterClientStopSpecConfig() { Client = Role("client"); First = Role("first"); Second = Role("second"); CommonConfig = ConfigurationFactory.ParseString(@" akka.loglevel = INFO akka.actor.provider = ""Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"" akka.remote.log-remote-lifecycle-events = off akka.cluster.client { heartbeat-interval = 1s acceptable-heartbeat-pause = 1s reconnect-timeout = 3s receptionist.number-of-contacts = 1 } akka.test.filter-leeway = 10s ") .WithFallback(ClusterClientReceptionist.DefaultConfig()) .WithFallback(DistributedPubSub.DefaultConfig()); }
static void Main(string[] args) { var config = ConfigurationFactory.ParseString(@" akka { extensions = [""Akka.Cluster.Tools.Client.ClusterClientReceptionistExtensionProvider, Akka.Cluster.Tools""] actor { provider = ""Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"" } remote { log-remote-lifecycle-events = DEBUG dot-netty.tcp { hostname = ""127.0.0.1"" port = 0 } } cluster { seed-nodes = [ ""akka.tcp://[email protected]:2551"", ] auto-down-unreachable-after = 30s roles = [client] client { initial-contacts = [""akka.tcp://[email protected]:2551/system/receptionist""] } } }"); using (var system = ActorSystem.Create("ClusterSystemClient", config)) { system.Settings.InjectTopLevelFallback(ClusterClientReceptionist.DefaultConfig()); var clusterClient = system.ActorOf(ClusterClient.Props(ClusterClientSettings.Create(system)), "greeting"); while (true) { var message = Console.ReadLine(); clusterClient.Tell(new ClusterClient.Send("/user/greeting", new Ping(message)), system.ActorOf(Props.Create <GreetingActor>())); } } }
public ClusterClientHandoverSpecConfig() { Client = Role("client"); First = Role("first"); Second = Role("second"); CommonConfig = ConfigurationFactory.ParseString(@" akka.loglevel = INFO akka.actor.provider = cluster akka.remote.log-remote-lifecycle-events = off akka.cluster.client { heartbeat-interval = 1d acceptable-heartbeat-pause = 1d reconnect-timeout = 3s refresh-contacts-interval = 1d } akka.test.filter-leeway = 10s ") .WithFallback(ClusterClientReceptionist.DefaultConfig()) .WithFallback(DistributedPubSub.DefaultConfig()) .WithFallback(MultiNodeClusterSpec.ClusterConfig()); }
public ClusterClientMessageSerializerSpec() : base(ConfigurationFactory.ParseString(@"akka.actor.provider = cluster akka.remote.dot-netty.tcp.port = 0") .WithFallback(ClusterClientReceptionist.DefaultConfig())) { }
public ClusterClientMessageSerializerSpec() : base(ClusterClientReceptionist.DefaultConfig()) { serializer = new ClusterClientMessageSerializer((ExtendedActorSystem)Sys); }
private void Receives() { Receive <ClusterEvent.CurrentClusterState>(state => { // Cluster List foreach (var member in state.Members) { UpdateClusterListView(member); } var removeMembers = new List <ListViewItem>(); foreach (ListViewItem item in _clusterListView.Items) { var exists = state.Members.FirstOrDefault(x => x.Address.ToString() == item.Name); if (exists == null) { removeMembers.Add(item); Members.Remove(item.Name); } } foreach (var removeMember in removeMembers) { _clusterListView.Items.RemoveByKey(removeMember.Name.ToString()); } // Unreachable var removeUnreachableMembers = new List <ListViewItem>(); foreach (ListViewItem item in _unreachableListView.Items) { var exists = state.Unreachable.FirstOrDefault(x => x.Address.ToString() == item.Name); if (exists == null) { removeUnreachableMembers.Add(item); } } foreach (var removeMember in removeUnreachableMembers) { _unreachableListView.Items.RemoveByKey(removeMember.Name.ToString()); } foreach (var member in state.Unreachable) { UpdateUnreachableListView(member); } // Seenby var removeSeenByMembers = new List <ListViewItem>(); foreach (ListViewItem item in _seenByListView.Items) { var exists = state.SeenBy.FirstOrDefault(x => x.ToString() == item.Name); if (exists == null) { removeSeenByMembers.Add(item); } } foreach (var removeMember in removeSeenByMembers) { _seenByListView.Items.RemoveByKey(removeMember.Name.ToString()); } foreach (var address in state.SeenBy) { var member = state.Members.FirstOrDefault(x => x.Address == address); UpdateSeenByListView(member); } // Set Cluster Leader foreach (ListViewItem item in _clusterListView.Items) { item.SubItems[4].Text = "False"; } if (state.Leader != null && _clusterListView.Items.ContainsKey(state.Leader.ToString())) { _clusterListView.Items[state.Leader.ToString()].SubItems[4].Text = "True"; } // Set RoleLeader var roles = Members.Select(x => x.Value.Roles.First()).Distinct().ToList(); foreach (var role in roles) { var address = state.RoleLeader(role); foreach (ListViewItem item in _clusterListView.Items) { if (item.SubItems[0].Text == role) { item.SubItems[5].Text = "False"; } } if (address != null && _clusterListView.Items.ContainsKey(address.ToString())) { _clusterListView.Items[address.ToString()].SubItems[5].Text = "True"; } } }); Receive <ClusterEvent.MemberUp>(mem => { _clusterListBox.Items.Insert(0, string.Format("{0} MemberUp: {1}, Role: {2}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), mem.Member, mem.Member.Roles.Join(","))); UpdateClusterListView(mem.Member); }); Receive <ClusterEvent.MemberExited>(mem => { _clusterListBox.Items.Insert(0, string.Format("{0} MemberExited: {1}, Role: {2}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), mem.Member, mem.Member.Roles.Join(","))); UpdateClusterListView(mem.Member); }); Receive <Messages.Messages.StartSchedule>(ic => { _clusterListBox.Items.Insert(0, string.Format("{0} Starting Schdule", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"))); ClusterStateTeller = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(TimeSpan.FromMilliseconds(20), TimeSpan.FromSeconds(ic.Seconds), Self, new Messages.Messages.GetClusterState(), Self); Program.MyActorSystem.Settings.InjectTopLevelFallback(ClusterClientReceptionist.DefaultConfig()); clusterClient = Program.MyActorSystem.ActorOf(ClusterClient.Props(ClusterClientSettings.Create(Program.MyActorSystem))); Context.Watch(clusterClient); }); Receive <Messages.Messages.GetClusterState>(ic => { _clusterListBox.Items.Insert(0, string.Format("{0} Getting for Cluster State", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"))); clusterClient.Tell(new ClusterClient.Send("/user/clustermanager", new ClusterManager.GetClusterState()), Self); }); Receive <Messages.Messages.StopSchedule>(ic => { _clusterListBox.Items.Insert(0, string.Format("{0} Stopping Schdule", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"))); ClusterStateTeller.Cancel(); if (clusterClient == null) { return; } clusterClient.GracefulStop(TimeSpan.FromSeconds(2)); }); Receive <ClusterEvent.UnreachableMember>(mem => { _clusterListBox.Items.Insert(0, string.Format("{0} UnreachableMember: {1}, Role: {2}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), mem.Member, mem.Member.Roles.Join(","))); UpdateClusterListView(mem.Member); UpdateUnreachableListView(mem.Member); }); Receive <ClusterEvent.ReachableMember>(mem => { _clusterListBox.Items.Insert(0, string.Format("{0} ReachableMember: {1}, Role: {2}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), mem.Member, mem.Member.Roles.Join(","))); UpdateClusterListView(mem.Member); _unreachableListView.Items.RemoveByKey(mem.Member.Address.ToString()); }); Receive <ClusterEvent.MemberRemoved>(mem => { _clusterListBox.Items.Insert(0, string.Format("{0} MemberRemoved: {1}, Role: {2}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), mem.Member, mem.Member.Roles.Join(","))); var key = mem.Member.Address.ToString(); if (Members.ContainsKey(key)) { _clusterListView.Items.RemoveByKey(key); } }); Receive <ClusterEvent.IMemberEvent>(mem => { _clusterListBox.Items.Insert(0, string.Format("{0} IMemberEvent: {1}, Role: {2}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), mem.Member, mem.Member.Roles.Join(","))); UpdateClusterListView(mem.Member); }); Receive <ClusterManager.SubscribeToManager> (ic => { Program.MyActorSystem.Settings.InjectTopLevelFallback(ClusterClientReceptionist.DefaultConfig()); clusterClient = Program.MyActorSystem.ActorOf(ClusterClient.Props(ClusterClientSettings.Create(Program.MyActorSystem))); Context.Watch(clusterClient); clusterClient.Tell(new ClusterClient.Send(ActorPaths.ClusterManagerActor.Path, new ClusterManager.SubscribeToManager())); }); Receive <ClusterManager.ClusterMessage>(ic => { _clusterListBox.Items.Insert(0, string.Format("{0} {1}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), ic.Message)); }); Receive <ClusterManager.UnSubscribeFromManager>(ic => { if (clusterClient == null) { return; } clusterClient.Tell(new ClusterClient.Send("/user/clustermanager", new ClusterManager.UnSubscribeFromManager()), Self); Context.Unwatch(clusterClient); clusterClient.GracefulStop(TimeSpan.FromSeconds(2)); }); Receive <Messages.Messages.MemberDown>(key => { if (clusterClient == null) { _clusterListBox.Items.Insert(0, string.Format("{0} {1}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), "You must subscribe first before forcing a member down.")); return; } if (Members.ContainsKey(key.Address)) { var member = Members[key.Address]; clusterClient.Tell(new ClusterClient.Send(ActorPaths.ClusterManagerActor.Path, new ClusterManager.MemberDown(Self.ToString(), member.Address)), Self); } }); Receive <Messages.Messages.MemberLeave>(key => { if (clusterClient == null) { _clusterListBox.Items.Insert(0, string.Format("{0} {1}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), "You must subscribe first before asking a member to leave.")); return; } if (Members.ContainsKey(key.Address)) { var member = Members[key.Address]; clusterClient.Tell(new ClusterClient.Send(ActorPaths.ClusterManagerActor.Path, new ClusterManager.MemberLeave(Self.ToString(), member.Address)), Self); } }); Receive <Terminated>(terminated => { _clusterListBox.Items.Insert(0, string.Format("{0} {1}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), terminated.AddressTerminated)); }); Receive <ClusterEvent.LeaderChanged>(leader => { _clusterListBox.Items.Insert(0, string.Format("{0} LeaderChanged: {1}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), leader.Leader != null ? leader.Leader.ToString() : "Missing Leader Value")); foreach (ListViewItem item in _clusterListView.Items) { item.SubItems[4].Text = "False"; } if (leader.Leader != null && _clusterListView.Items.ContainsKey(leader.Leader.ToString())) { _clusterListView.Items[leader.Leader.ToString()].SubItems[4].Text = "True"; } }); Receive <ClusterEvent.RoleLeaderChanged>(leader => { _clusterListBox.Items.Insert(0, string.Format("{0} RoleLeaderChanged: {1}, Role: {2}", DateTime.Now.ToString("MM-dd-yy hh:mm:ss.fff"), leader.Leader != null ? leader.Leader.ToString() : "Missing Leader Value", leader.Role.ToString())); foreach (ListViewItem item in _clusterListView.Items) { if (item.SubItems[0].Text == leader.Role) { item.SubItems[5].Text = "False"; } } if (leader.Leader != null && _clusterListView.Items.ContainsKey(leader.Leader.ToString())) { _clusterListView.Items[leader.Leader.ToString()].SubItems[5].Text = "True"; } }); }