2017-07-13 1 views
0

Ce que je suis en train d'accomplir est juste que: Run Silo et le client dans le même AppDomainComment exécuter Microsoft Orleans Silo et le client dans le même AppDomain

utilisant des tutoriels de tout d'Orléans va parfaitement:

static void Main(string[] args) 
{ 
    AppDomain hostDomain = AppDomain.CreateDomain("OrleansHost", null, 
     new AppDomainSetup() 
     { 
      AppDomainInitializer = InitSilo 
     }); 

    DoSomeClientWork(); 

    hostDomain.DoCallBack(ShutdownSilo); 
} 

static void InitSilo(string[] args) 
{ 
    siloHost = new SiloHost(System.Net.Dns.GetHostName()) 
    { 
     ConfigFileName = "SiloConfiguration.xml" 
    }; 

    siloHost.InitializeOrleansSilo(); 
    var startedok = siloHost.StartOrleansSilo(); //Works perfectly 
    if (!startedok) 
     throw new SystemException(String.Format("Failed to start Orleans silo '{0}' as a {1} node", siloHost.Name, siloHost.Type)); 
} 

static void DoSomeClientWork() 
{ 
    var config = Orleans.Runtime.Configuration.ClientConfiguration.LocalhostSilo(30000); 
    GrainClient.Initialize(config); 

    var friend = GrainClient.GrainFactory.GetGrain<IHello>(0); 
    var result = friend.SayHello("Goodbye").Result; 
    Console.WriteLine(result); 
} 

les problèmes viennent quand je veux utiliser le même AppDomain:

static void Main(string[] args) 
{ 
    //Same AppDomain 
    Task.Run(() => InitSilo()); 
    DoSomeClientWork(); //This is changed to await/retry until the Silo is Up 

    ShutdownSilo(); 
} 

Pourquoi je suis tryin g pour suivre ce chemin: L'idée est d'empêcher que le client ne sorte et ne revienne sur le réseau car il fonctionne sur la même machine. Cela génère un surcoût dû à l'activité réseau. Donc j'essaie d'éviter cette surcharge.

Bien sûr, dans le cas où le silo local est en panne, le client doit sortir à travers le réseau afin de trouver un silo disponible.

Ce qui rend la chose trop compliquée est le fait que je ne peux pas voir une erreur utile, juste des erreurs et quelques erreurs de référence de la bibliothèque ne trouve pas.

Le code original a été simplifié juste pour éviter l'obtenir sale, mais si vous sentez que vous avez besoin de voir ce que je l'ai fait jusqu'à présent, juste faites-moi savoir. Toute aide, recommandation ou suggestion est utile.

+1

avez-vous pensé à utiliser le bootstrapper? https://dotnet.github.io/orleans/Documentation/Advanced-Concepts/Application-Bootstrap-within-a-Silo.html – BozoJoe

+0

Oui, c'est une autre option à laquelle je pense car je n'arrive pas à trouver un moyen de accomplir ce que je veux. –

+0

Je suppose que la question est ... quel genre de travail le client fait-il? – BozoJoe

Répondre

1

Si vous effectuez une mise à niveau vers la version 1.5.0 d'Orléans, vous devriez être en mesure de réaliser cela, car beaucoup de statistiques ont été supprimées. Vous devez également utiliser ClientBuilder et IClusterClient directement à la place du GrainClient statique pour que cela fonctionne. En fait, le modèle par défaut dans VS une fois la mise à niveau vers la version 1.5.0 n'utilise plus d'AppDomains distincts pour l'hôte client/silo. Cela dit, il n'y a actuellement aucun support intégré pour ignorer le code réseau, même sous le même AppDomain, mais nous sommes dans la phase de planification pour commencer à le prendre en charge. La pensée actuelle est que vous utilisez toujours l'abstraction IClusterClient, mais sous le capot, nous ferons quelque chose de plus intelligent en ne faisant pas de réseautage supplémentaire. C'est donc le pari le plus sûr de commencer à l'utiliser même s'il n'est pas encore optimisé.

+0

Hey, merci pour la réponse. Après avoir lu beaucoup, j'ai découvert exactement ce que vous avez dit. Malheureusement, je dois garder la version 1.4.2 pour l'instant en raison de la mise en œuvre que nous avons en production. Ma prochaine étape est de déménager à Orléans 1.5 et de commencer à jouer avec. –

+0

Juste une note à propos de la mise à niveau: si vous utilisez le tableau de bord, il ne fonctionne pas encore avec 1.5 (au moins, il n'a pas pour moi). – Gigi