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; }
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(); } }
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);
/// <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); } }
/// <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); } }
public static Props Props(ReplicatorSettings settings) { return(Actor.Props.Create(() => new Replicator(settings)).WithDeploy(Deploy.Local).WithDispatcher(settings.Dispatcher)); }