INTERNAL API Read view of the cluster's state, updated via subscription of cluster events published on the EventBus{TEvent,TClassifier,TSubscriber}.
Inheritance: IDisposable
コード例 #1
0
        public Cluster(ActorSystemImpl system)
        {
            System    = system;
            _settings = new ClusterSettings(system.Settings.Config, system.Name);

            var provider = system.Provider as ClusterActorRefProvider;

            if (provider == null)
            {
                throw new ConfigurationException(
                          String.Format("ActorSystem {0} needs to have a 'ClusterActorRefProvider' enabled in the configuration, currently uses {1}",
                                        system,
                                        system.Provider.GetType().FullName));
            }
            _selfUniqueAddress = new UniqueAddress(provider.Transport.DefaultAddress, AddressUidExtension.Uid(system));

            _log = Logging.GetLogger(system, "Cluster");

            LogInfo("Starting up...");

            _failureDetector = new DefaultFailureDetectorRegistry <Address>(() => FailureDetectorLoader.Load(_settings.FailureDetectorImplementationClass, _settings.FailureDetectorConfig,
                                                                                                             system));

            _scheduler = CreateScheduler(system);

            //create supervisor for daemons under path "/system/cluster"
            _clusterDaemons = system.SystemActorOf(Props.Create(() => new ClusterDaemon(_settings)).WithDeploy(Deploy.Local), "cluster");

            //TODO: Pretty sure this is bad and will at least throw aggregateexception possibly worse.
            _clusterCore = GetClusterCoreRef().Result;

            _readView = new ClusterReadView(this);
        }
コード例 #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Cluster"/> class.
        /// </summary>
        /// <param name="system">The actor system that hosts the cluster.</param>
        /// <exception cref="ConfigurationException">
        /// This exception is thrown if the <paramref name="system"/> does not have a <see cref="ClusterActorRefProvider"/> enabled in the configuration.
        /// </exception>
        public Cluster(ActorSystemImpl system)
        {
            System   = system;
            Settings = new ClusterSettings(system.Settings.Config, system.Name);

            if (!(system.Provider is IClusterActorRefProvider provider))
            {
                throw new ConfigurationException(
                          $"ActorSystem {system} needs to have a 'IClusterActorRefProvider' enabled in the configuration, currently uses {system.Provider.GetType().FullName}");
            }
            SelfUniqueAddress = new UniqueAddress(provider.Transport.DefaultAddress, AddressUidExtension.Uid(system));

            _log = Logging.GetLogger(system, "Cluster");

            CurrentInfoLogger = new InfoLogger(_log, Settings, SelfAddress);

            LogInfo("Starting up...");

            var clusterCoreTaskSource = new TaskCompletionSource <IActorRef>();

            _clusterCoreTask = clusterCoreTaskSource.Task;

            FailureDetector = new DefaultFailureDetectorRegistry <Address>(() => FailureDetectorLoader.Load(Settings.FailureDetectorImplementationClass, Settings.FailureDetectorConfig,
                                                                                                            system));

            Scheduler = CreateScheduler(system);

            // it has to be lazy - otherwise if downing provider will init a cluster itself, it will deadlock
            _downingProvider = new Lazy <IDowningProvider>(() => Akka.Cluster.DowningProvider.Load(Settings.DowningProviderType, system), LazyThreadSafetyMode.ExecutionAndPublication);

            //create supervisor for daemons under path "/system/cluster"
            _clusterDaemons = system.SystemActorOf(Props.Create(() => new ClusterDaemon(Settings)).WithDeploy(Deploy.Local), "cluster");

            _readView = new ClusterReadView(this);

            // force the underlying system to start
            _ = Task.Run(async() =>
            {
                try
                {
                    _clusterCore = await _clusterDaemons.Ask <IActorRef>(new InternalClusterAction.GetClusterCoreRef(this), System.Settings.CreationTimeout).ConfigureAwait(false);
                    clusterCoreTaskSource.SetResult(_clusterCore);

                    system.RegisterOnTermination(Shutdown);
                    LogInfo("Started up successfully");
                }
                catch (Exception ex)
                {
                    _log.Error(ex, "Failed to startup Cluster. You can try to increase 'akka.actor.creation-timeout'.");
                    Shutdown();
                    System.DeadLetters.Tell(ex); //don't re-throw the error. Just log it.

                    _clusterCore = System.DeadLetters;
                    clusterCoreTaskSource.SetResult(_clusterCore);
                }
            });
        }
コード例 #3
0
ファイル: Cluster.cs プロジェクト: yfer/akka.net
        public Cluster(ActorSystemImpl system)
        {
            System   = system;
            Settings = new ClusterSettings(system.Settings.Config, system.Name);

            var provider = system.Provider as ClusterActorRefProvider;

            if (provider == null)
            {
                throw new ConfigurationException(
                          String.Format("ActorSystem {0} needs to have a 'ClusterActorRefProvider' enabled in the configuration, currently uses {1}",
                                        system,
                                        system.Provider.GetType().FullName));
            }
            SelfUniqueAddress = new UniqueAddress(provider.Transport.DefaultAddress, AddressUidExtension.Uid(system));

            _log = Logging.GetLogger(system, "Cluster");

            LogInfo("Starting up...");

            _failureDetector = new DefaultFailureDetectorRegistry <Address>(() => FailureDetectorLoader.Load(Settings.FailureDetectorImplementationClass, Settings.FailureDetectorConfig,
                                                                                                             system));

            _scheduler = CreateScheduler(system);

            // it has to be lazy - otherwise if downing provider will init a cluster itself, it will deadlock
            _downingProvider = new Lazy <IDowningProvider>(() => Akka.Cluster.DowningProvider.Load(Settings.DowningProviderType, system), LazyThreadSafetyMode.ExecutionAndPublication);

            //create supervisor for daemons under path "/system/cluster"
            _clusterDaemons = system.SystemActorOf(Props.Create(() => new ClusterDaemon(Settings)).WithDeploy(Deploy.Local), "cluster");

            _readView = new ClusterReadView(this);

            // force the underlying system to start
            _clusterCore = GetClusterCoreRef().Result;

            system.RegisterOnTermination(Shutdown);

            LogInfo("Started up successfully");
        }
コード例 #4
0
            public EventBusListener(Cluster cluster, ClusterReadView readView)
            {
                _cluster = cluster;
                _readView = readView;

                Receive<ClusterEvent.IClusterDomainEvent>(clusterDomainEvent =>
                {
                    clusterDomainEvent.Match()
                        .With<ClusterEvent.SeenChanged>(changed =>
                        {
                            State = State.Copy(seenBy: changed.SeenBy);
                        })
                        .With<ClusterEvent.ReachabilityChanged>(changed =>
                        {
                            _readView._reachability = changed.Reachability;
                        })
                        .With<ClusterEvent.MemberRemoved>(removed =>
                        {
                            State = State.Copy(members: State.Members.Remove(removed.Member),
                                unreachable: State.Unreachable.Remove(removed.Member));
                        })
                        .With<ClusterEvent.UnreachableMember>(member =>
                        {
                            // replace current member with new member (might have different status, only address is used in == comparison)
                            State = State.Copy(unreachable: State.Unreachable.Remove(member.Member).Add(member.Member));
                        })
                        .With<ClusterEvent.ReachableMember>(member =>
                        {
                            State = State.Copy(unreachable: State.Unreachable.Remove(member.Member));
                        })
                        .With<ClusterEvent.IMemberEvent>(memberEvent =>
                        {
                            var newUnreachable = State.Unreachable;
                            // replace current member with new member (might have different status, only address is used in == comparison)
                            if (State.Unreachable.Contains(memberEvent.Member))
                                newUnreachable = State.Unreachable.Remove(memberEvent.Member).Add(memberEvent.Member);
                            State = State.Copy(
                                members: State.Members.Remove(memberEvent.Member).Add(memberEvent.Member),
                                unreachable: newUnreachable);
                        })
                        .With<ClusterEvent.LeaderChanged>(changed =>
                        {
                            State = State.Copy(leader: changed.Leader);
                        })
                        .With<ClusterEvent.RoleLeaderChanged>(changed =>
                        {
                            State = State.Copy(roleLeaderMap: State.RoleLeaderMap.SetItem(changed.Role, changed.Leader));
                        })
                        .With<ClusterEvent.CurrentInternalStats>(stats =>
                        {
                            readView._latestStats = stats;
                        })
                        .With<ClusterEvent.ClusterMetricsChanged>(changed =>
                        {
                            readView._clusterMetrics = changed.NodeMetrics;
                        })
                        .With<ClusterEvent.ClusterShuttingDown>(_ => { });
                });

                Receive<ClusterEvent.CurrentClusterState>(state =>
                {
                    State = state;
                });
            }
コード例 #5
0
            public EventBusListener(Cluster cluster, ClusterReadView readView)
            {
                _cluster  = cluster;
                _readView = readView;

                Receive <ClusterEvent.IClusterDomainEvent>(clusterDomainEvent =>
                {
                    clusterDomainEvent.Match()
                    .With <ClusterEvent.SeenChanged>(changed =>
                    {
                        State = State.Copy(seenBy: changed.SeenBy);
                    })
                    .With <ClusterEvent.ReachabilityChanged>(changed =>
                    {
                        _readView._reachability = changed.Reachability;
                    })
                    .With <ClusterEvent.MemberRemoved>(removed =>
                    {
                        State = State.Copy(members: State.Members.Remove(removed.Member),
                                           unreachable: State.Unreachable.Remove(removed.Member));
                    })
                    .With <ClusterEvent.UnreachableMember>(member =>
                    {
                        // replace current member with new member (might have different status, only address is used in == comparison)
                        State = State.Copy(unreachable: State.Unreachable.Remove(member.Member).Add(member.Member));
                    })
                    .With <ClusterEvent.ReachableMember>(member =>
                    {
                        State = State.Copy(unreachable: State.Unreachable.Remove(member.Member));
                    })
                    .With <ClusterEvent.IMemberEvent>(memberEvent =>
                    {
                        var newUnreachable = State.Unreachable;
                        // replace current member with new member (might have different status, only address is used in == comparison)
                        if (State.Unreachable.Contains(memberEvent.Member))
                        {
                            newUnreachable = State.Unreachable.Remove(memberEvent.Member).Add(memberEvent.Member);
                        }
                        State = State.Copy(
                            members: State.Members.Remove(memberEvent.Member).Add(memberEvent.Member),
                            unreachable: newUnreachable);
                    })
                    .With <ClusterEvent.LeaderChanged>(changed =>
                    {
                        State = State.Copy(leader: changed.Leader);
                    })
                    .With <ClusterEvent.RoleLeaderChanged>(changed =>
                    {
                        State = State.Copy(roleLeaderMap: State.RoleLeaderMap.SetItem(changed.Role, changed.Leader));
                    })
                    .With <ClusterEvent.CurrentInternalStats>(stats =>
                    {
                        readView._latestStats = stats;
                    })
                    .With <ClusterEvent.ClusterShuttingDown>(_ => { });
                });

                Receive <ClusterEvent.CurrentClusterState>(state =>
                {
                    State = state;
                });
            }