2016-03-23 23 views
3

Uzak istekleri kabul eden ve yanıtları işleyen ve geri gönderen bir hizmette bir Akka.Net aktör sistemi uyguladım. Sistemdeki aktörlerden bazıları veritabanına kalıcı hale gelen bir duruma sahiptir. Aktör sistemi başladığında, bu aktörler durumlarını veritabanından okuyarak hidratlanırlar.Akka.Net'te Artıklık ve Yük Devretme İşlemi

Bir istek geldiğinde, aktörler istek üzerine tembel olarak yüklenir ve daha fazla istekleri işlemek için bellekte yerleşik kalırlar.

Şimdi artık en basit şekilde nasıl yedekleme sağlayabileceğime bakıyorum.

Buradaki en basit çözüm, servisin ikinci bir kopyasının "soğuk" bekleme durumunda olması gerektiğini tahmin ediyorum. İlk düğüm aşağı düştüğünde, talepler ikinci düğüme yönlendirilir. Bu da, aktörler oluşturmaya ve durumlarını veritabanından almaya başlar. o kadar geldiğinde

Sonra orijinal düğüm,

nedir, 'asıl' ve tüm aktörleri sonlandırmak (yani aktif hale geldiğinde o diskten geri devlet ile bunları okuyabilir) olduğunu kabul etmek gerekir Bunu başarmanın en iyisi? Sanırım Akka.Cluster'ı kullanmalı ve düğümler bir kümeye katıldığında mı yoksa bir kümeden mi ayrılmalıyım? Ama bütün mesajların esasen bir düğüme gitmesi gerektiğini nasıl söyleyebilirim? Bir çeşit lider seçim süreci var mı, ama bir bütün olarak kümelenme yerine bireysel roller için mi?

Bunu yapmanın daha iyi/daha basit bir yolu var mı?

cevap

0

Akka.net kullanarak yeni başlayan biriyim ama Akka.Net Cluster + SingletonActor'ı kullanabileceğinizi düşünüyorum. Burada bazı testler yapıyorum ve çok iyi çalışıyor gibi görünüyor.

Örnek:

private void Start() { 
     var system = ActorSystem.Create("SingletonActorSystem"); 
     var cluster = Cluster.Get(system); 
     cluster.RegisterOnMemberRemoved(() => MemberRemoved(system)); 

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

     Console.ReadLine(); 

     cluster.Leave(cluster.SelfAddress); 
     _leaveClusterEvent.WaitOne(); 
    } 

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

Yapılandırma:

akka { 
     suppress-json-serializer-warning = on 

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

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

     cluster { 
      auto-down-unreachable-after = 5s 
      down-removal-margin = 5s 
      seed-nodes = [ "akka.tcp://[email protected]:4053" ] 
      roles = [worker] 

      singleton { 
       singleton-name = "processorCoordinator" 
       role = "worker" 
       hand-over-retry-interval = 5s 
      } 
     } 
    } 
İlgili konular