示例#1
0
 /// <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;
        }
示例#3
0
        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}");
                    }
                });
            }
        }
示例#5
0
        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
        }
示例#6
0
        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());
        }
示例#8
0
        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()))
 {
 }
示例#11
0
 public ClusterClientMessageSerializerSpec() : base(ClusterClientReceptionist.DefaultConfig())
 {
     serializer = new ClusterClientMessageSerializer((ExtendedActorSystem)Sys);
 }
示例#12
0
        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";
                }
            });
        }