示例#1
0
        public Replicator(ReplicatorSettings settings)
        {
            _settings          = settings;
            _cluster           = Cluster.Cluster.Get(Context.System);
            _selfAddress       = _cluster.SelfAddress;
            _selfUniqueAddress = _cluster.SelfUniqueAddress;
            _log = Context.GetLogger();

            if (_cluster.IsTerminated)
            {
                throw new ArgumentException("Cluster node must not be terminated");
            }
            if (!string.IsNullOrEmpty(_settings.Role) && !_cluster.SelfRoles.Contains(_settings.Role))
            {
                throw new ArgumentException($"The cluster node {_selfAddress} does not have the role {_settings.Role}");
            }

            _gossipTask  = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(_settings.GossipInterval, _settings.GossipInterval, Self, GossipTick.Instance, Self);
            _notifyTask  = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(_settings.NotifySubscribersInterval, _settings.NotifySubscribersInterval, Self, FlushChanges.Instance, Self);
            _pruningTask = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(_settings.PruningInterval, _settings.PruningInterval, Self, RemovedNodePruningTick.Instance, Self);
            _clockTask   = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(_settings.GossipInterval, _settings.GossipInterval, Self, ClockTick.Instance, Self);

            _serializer = Context.System.Serialization.FindSerializerForType(typeof(DataEnvelope));
            _maxPruningDisseminationNanos = _settings.MaxPruningDissemination.Ticks * 100;

            _previousClockTime = DateTime.UtcNow.Ticks * 100;
        }
示例#2
0
        public Replicator(ReplicatorSettings settings)
        {
            _settings          = settings;
            _cluster           = Cluster.Cluster.Get(Context.System);
            _selfAddress       = _cluster.SelfAddress;
            _selfUniqueAddress = _cluster.SelfUniqueAddress;
            _log = Context.GetLogger();

            if (_cluster.IsTerminated)
            {
                throw new ArgumentException("Cluster node must not be terminated");
            }
            if (!string.IsNullOrEmpty(_settings.Role) && !_cluster.SelfRoles.Contains(_settings.Role))
            {
                throw new ArgumentException($"The cluster node {_selfAddress} does not have the role {_settings.Role}");
            }

            _gossipTask  = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(_settings.GossipInterval, _settings.GossipInterval, Self, GossipTick.Instance, Self);
            _notifyTask  = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(_settings.NotifySubscribersInterval, _settings.NotifySubscribersInterval, Self, FlushChanges.Instance, Self);
            _pruningTask = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(_settings.PruningInterval, _settings.PruningInterval, Self, RemovedNodePruningTick.Instance, Self);
            _clockTask   = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(_settings.GossipInterval, _settings.GossipInterval, Self, ClockTick.Instance, Self);

            _serializer = Context.System.Serialization.FindSerializerForType(typeof(DataEnvelope));
            _maxPruningDisseminationNanos = _settings.MaxPruningDissemination.Ticks * 100;

            _previousClockTime = DateTime.UtcNow.Ticks * 100;

            _hasDurableKeys = settings.DurableKeys.Count > 0;
            var durableKeysBuilder = ImmutableHashSet <string> .Empty.ToBuilder();

            var durableWildcardsBuilder = ImmutableHashSet <string> .Empty.ToBuilder();

            foreach (var key in settings.DurableKeys)
            {
                if (key.EndsWith("*"))
                {
                    durableWildcardsBuilder.Add(key.Substring(0, key.Length - 1));
                }
                else
                {
                    durableKeysBuilder.Add(key);
                }
            }

            _durableKeys      = durableKeysBuilder.ToImmutable();
            _durableWildcards = durableWildcardsBuilder.ToImmutable();

            _durableStore = _hasDurableKeys
                ? Context.Watch(Context.ActorOf(_settings.DurableStoreProps, "durableStore"))
                : Context.System.DeadLetters;

            if (_hasDurableKeys)
            {
                Load();
            }
            else
            {
                NormalReceive();
            }
        }
示例#3
0
 private static Props GetSupervisedReplicator(ReplicatorSettings settings, string name) => BackoffSupervisor.Props(
     Backoff.OnStop(
         childProps: Akka.DistributedData.Replicator.Props(settings),
         childName: name,
         minBackoff: TimeSpan.FromSeconds(3),
         maxBackoff: TimeSpan.FromSeconds(300),
         randomFactor: 0.2,
         maxNrOfRetries: -1)
     .WithFinalStopMessage(m => m is Terminate))
 .WithDeploy(Deploy.Local).WithDispatcher(settings.Dispatcher);
示例#4
0
        /// <summary>
        /// TBD
        /// </summary>
        /// <param name="system">TBD</param>
        public DistributedData(ExtendedActorSystem system)
        {
            system.Settings.InjectTopLevelFallback(DefaultConfig());
            var config = system.Settings.Config.GetConfig("akka.cluster.distributed-data");

            _settings = ReplicatorSettings.Create(config);
            _system   = system;
            if (IsTerminated)
            {
                system.Log.Warning("Replicator points to dead letters: Make sure the cluster node is not terminated and has the proper role!");
                Replicator = system.DeadLetters;
            }
            else
            {
                var name = config.GetString("name");
                Replicator = system.ActorOf(Akka.DistributedData.Replicator.Props(_settings), name);
            }
        }
示例#5
0
        /// <summary>
        /// TBD
        /// </summary>
        /// <param name="system">TBD</param>
        public DistributedData(ExtendedActorSystem system)
        {
            system.Settings.InjectTopLevelFallback(DefaultConfig());
            var config = system.Settings.Config.GetConfig("akka.cluster.distributed-data");

            if (config.IsNullOrEmpty())
            {
                throw ConfigurationException.NullOrEmptyConfig <DistributedData>("akka.cluster.distributed-data");
            }

            _settings = ReplicatorSettings.Create(config);
            _system   = system;
            if (IsTerminated)
            {
                var log     = Logging.GetLogger(_system, GetType());
                var cluster = Cluster.Cluster.Get(_system);
                if (cluster.IsTerminated)
                {
                    log.Warning("Replicator points to dead letters, because Cluster is terminated.");
                }
                else
                {
                    log.Warning(
                        "Replicator points to dead letters. Make sure the cluster node is not terminated and has the proper role. " +
                        "Node has roles [{0}], Distributed Data is configured for role [{1}]",
                        string.Join(",", cluster.SelfRoles),
                        _settings.Role);
                }
                Replicator = system.DeadLetters;
            }
            else
            {
                var name = config.GetString("name", null);
                Replicator = _settings.RestartReplicatorOnFailure
                    ? system.ActorOf(GetSupervisedReplicator(_settings, name), name + "Supervisor")
                    : system.ActorOf(Akka.DistributedData.Replicator.Props(_settings), name);
            }
        }
示例#6
0
 public static Props Props(ReplicatorSettings settings)
 {
     return(Actor.Props.Create(() => new Replicator(settings)).WithDeploy(Deploy.Local).WithDispatcher(settings.Dispatcher));
 }