2011-08-29 2 views
1

Excuses si cela semble que je veux que mon problème soit sauvegardé pour moi, mais je suis tombé sur stact il y a quelque temps et il semble que ce serait une bibliothèque à portée de main, et je pense que ça marcherait bien pour le problème à portée de main. J'ai regardé le code source, et il y en a beaucoup là-dedans! :) Je ne sais pas par où commencer. Ce dont j'ai besoin, c'est d'un composant (acteur?) Qui envoie périodiquement des requêtes web asynchrones et stocke les résultats localement (un peu d'analyse des résultats aura lieu en premier). D'autres discussions demanderont les résultats à différents moments. D'après ce que je peux voir, j'ai besoin d'un planificateur, d'une fibre et d'un canal pour gérer le renvoi des résultats à ceux qui le demandent. Quelque chose le long des lignes de:Faire une demande asynchrone avec stact

private static readonly ConcurrentDictionary<Uri, ServerLoad> ServerLoads = new ConcurrentDictionary<string, ServerLoad>(); 
public Channel<Request<IEnumerable<ServerLoad>>> ServerLoadChannel { get; private set; 
public LoadRetriever(Inbox inbox, Fiber fiber, Scheduler scheduler, ILoadBalancerConfiguration config) 
{ 
    this.inbox = inbox; 
    this.fiber = fiber; 
    this.scheduler = scheduler; 

    this.scheduler.Schedule(
     0, 
     config.FetchIntervalMilliSecs, 
     fiber, 
     () => 
      { 
       foreach (var server in config.Servers) 
       { 
        // need someway to send async web request to url in 
        // server.LoadRetrievalAddress and save/update result 
        // in ServerLoads dictionary 
       } 
      }); 

    this.ServerLoadChannel = new ConsumerChannel<Request<IEnumerable<ServerLoad>>>(this.fiber, 
     request => request.Respond(ServerLoads.Values)); 
} 

}

Ceci est d'autant théorique pour le moment, et peut-être mal completly, le principal problème que j'ai fait les demandes async (WebClient.DownloadStringAsync() et DownloadStringCompleted). Quelque chose qui fait le contraire de AsyncResultChannel

Des conseils/exemples/pousser dans la bonne direction seraient appréciés!

(a essayé de créer une balise pour stact mais ma réputation est pas assez bon: S)

Répondre

2

Eh bien, il y a quelques petites choses ici. Tout d'abord, vous devez créer une classe qui est un acteur, en utilisant:

public class MyServerCoordinator : Actor 
{} 

Ensuite, cet acteur chargerez la configuration et créer un autre acteur pour chaque instance de serveur. Cela permettra à chaque serveur configuré d'avoir ses informations récupérées selon son propre calendrier.

Ensuite, vous devrez créer un ActorFactory pour chaque type, en utilisant:

var factory = ActorFactory.Create((i,f,s) => new MyServerCoordinator(i,f,s)); 
var actor = factory.GetActor(); 

Avec le passage de messages, vous devez créer une classe de message pour chaque message que vous souhaitez échanger entre les acteurs au lieu d'utiliser CLR brut les types.

De même, dans le constructeur de chaque acteur, vous pouvez configurer une boucle de réception pour traiter les demandes séparément des mises à jour planifiées. Les acteurs peuvent communiquer entre eux en envoyant des demandes, qui incluent un canal de réponse à l'expéditeur. Cela permettra aux acteurs par serveur de communiquer avec le coordinateur. Chaque acteur a sa propre fibre, il n'est donc pas nécessaire d'utiliser des types de collection concurrents ou des mécanismes de verrouillage. Le modèle d'acteur gère la concurrence via le passage de message, donc les sémaphores et autres ne sont pas utilisés.

Vous aurez également besoin de vérifier certains des échantillons dans les tests unitaires pour voir comment interagir avec l'acteur à partir de code non-acteur en utilisant la déclaration en ligne AnonymousActor.New().

+0

Je vais aussi souligner, Stact est sous une forme très nette avec la version 1.0. Si vous ne faites pas attention, vous pouvez vous couper. :) –

+0

Merci pour les conseils, je vais essayer. Espérons que la coupe ne sera pas fatale, et la coupe qui ne vous tue pas vous rend plus fort! ;) –

+0

Comment la boîte de réception est-elle fournie à cet acteur? – Damian

1

Un bon endroit pour commencer serait probablement avec Cashbox https://github.com/Cashbox/Cashbox. Je l'ai écrit avec une version plus ancienne de Stact, mais la plupart des concepts devraient être correctement transférés.

https://github.com/Cashbox/Cashbox/blob/master/src/Cashbox/Engines/FileStorageEngine.cs est l'endroit où toute la magie basée sur l'acteur se produit. https://github.com/Cashbox/Cashbox/blob/master/src/Cashbox/Engines/FileStorageEngine.cs#L182 est tout au sujet de faire une demande et attendre une réponse.