2016-08-08 2 views
2

Я пытаюсь использовать Akker.Net Cluster Tools, чтобы использовать поведение Singleton и, кажется, работает отлично, но только когда текущий синглтон-узел " хост "изящно оставляет кластер. Если я внезапно выключу узел узла, передача обслуживания не произойдет.Akka.Net cluster singleton - хэндовер не возникает, когда текущее одноточечное выключение компьютера неожиданно

фон

Я строю систему, которая будет состоять из четырех узлов (на начальном этапе). Один из этих узлов будет «координатором рабочих», и он будет отвечать за мониторинг некоторых данных из базы данных и, при необходимости, отправлять рабочие места другим работникам. Я подумывал подписаться на события кластера и использовать событие изменения роли, чтобы сделать актера (на узле лидера), чтобы стать координатором, но я думаю, что Cluster Singleton будет лучшим выбором в этом случае.

Работа образца (но только если я грациозно покинуть кластер)

private void Start() { 
    Console.Title = "Worker"; 

    var section = (AkkaConfigurationSection)ConfigurationManager.GetSection("akka"); 
    var config = section.AkkaConfig; 

    // Create a new actor system (a container for your actors) 
    var system = ActorSystem.Create("SingletonActorSystem", config); 
    var cluster = Cluster.Get(system); 
    cluster.RegisterOnMemberRemoved(() => MemberRemoved(system)); 
    var settings = new ClusterSingletonManagerSettings("processorCoordinatorInstance", 
     "worker", TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(1)); 

    var actor = system.ActorOf(ClusterSingletonManager.Props(
     singletonProps: Props.Create<ProcessorCoordinatorActor>(), 
     terminationMessage: PoisonPill.Instance, 
     settings: settings), 
     name: "processorCoordinator"); 

    string line = Console.ReadLine(); 

    if (line == "g") { //handover works 
     cluster.Leave(cluster.SelfAddress); 
     _leaveClusterEvent.WaitOne(); 
     system.Shutdown(); 
    } else { //doesn't work 
     system.Shutdown(); 
    } 
} 

private async void MemberRemoved(ActorSystem actorSystem) { 
    await actorSystem.Terminate(); 
    _leaveClusterEvent.Set(); 
} 

Конфигурация

akka { 
    suppress-json-serializer-warning = on 

    actor { 
     provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster" 
    } 

    remote { 
     helios.tcp { 
      port = 0 
      hostname = localhost 
     } 
    } 

    cluster { 
     seed-nodes = ["akka.tcp://[email protected]:4053"] 
     roles = [worker] 
    } 
} 
+1

Вы пытались установить 'akka.cluster.auto-down-unreachable-after' до некоторого таймаута (например, 10 секунд)? – Horusiath

+0

Tks @Horusiath! –

ответ

0

Спасибо @Horusiath, ваш ответ суммарно правильно! Я не смог найти эту конфигурацию в документации akka.net, и я не понимал, что должен был взглянуть на документацию akka. Большое спасибо!

Вы пытались установить akka.cluster.auto-down-unreachable-after через некоторое время (например, 10 секунд)? - Horusiath Aug 12 at 11:27

Смежные вопросы