Question

Je travaille sur un service Web pour lire les données à partir d'un flux 3ème partie, modifier un peu et de le stocker, puis retourner à mes clients. Il n'a besoin que de mettre à jour à partir du site 3ème partie périodiquement. Il sera exécuté en tant que service WCF dans un rôle Web dans Azure.

Au début, je pensais que je ferais juste toujours un appel à ma méthode de parsefeed, mais faire que le retour d'appel si la dernière mise à jour était trop tôt ...

   public void ParseFeed()
    {
        if (DateTime.Now > lastrun.AddMinutes(1))
        {
         //Fetch updated data into something shared here.
         //thedata is a public static in Global class 
         thedata = fetchdata();
         lastrun=DateTime.Now;            
        }
    }

Mais je suppose que l'opération d'extraction peut prendre 1-2s (son service Web) que plusieurs utilisateurs frapperont ce code à la fois.

  

de http://support.microsoft.com/ default.aspx scid = kb;? en-us; Q312607   Parce que les membres statiques de toute classe, y compris une classe d'application, ne sont pas thread-safe, le code utilisateur doit fournir le verrouillage approprié pour accéder aux membres statiques. Ceci est valable pour tout membre statique que vous ajoutez à la classe d'application.

  • Je pourrais utiliser le verrouillage (pas sûr) EDIT: beaucoup d'informations ici

  • Je pourrais éviter le var statique et utiliser un cache, et de mettre mes données (mais ce serait supprimeront à expiration et que plusieurs utilisateurs essaierais de récupérer les données)

  • Je pourrais utiliser un cache avec un élément de faux des données qu'il contient (essentiellement comme une minuterie) et rafraîchir quand cela a expiré - mais qui actualisez même si personne ne cognait le site. (Mai pas non plus être thread-safe)

  • Je ne peux pas vraiment utiliser un cache de sortie parce que les clients interrogent les données que je reviens d'une manière qui fait probablement chaque demande unique: mes sortes de services et les filtres selon la demande

BTW, je ne suis pas inquiet au sujet de la cohérence des résultats sur plusieurs instances sur Azure. Chacun peut aller chercher leur propre donc je ne dois pas l'état de l'action sur plusieurs serveurs.

J'ai l'impression il y a une solution simple, que j'ai totalement raté. Idées?

Était-ce utile?

La solution

A partir de votre question, il ressemble à:

  • Il est inacceptable de servir des données qui est plus d'une minute sur la date
  • Il est acceptable si deux instances de service renvoient des données différentes en raison des temps de rafraîchissement étant désynchronisée
  • Il est acceptable pour les appelants de bloquer pendant 1-2 secondes tandis que les données sont actualisées

En supposant ce sont tout à fait vrai, alors la solution la plus simple est juste d'utiliser une variable statique pour stocker les données, avec une construction de lock autour de l'ensemble vérification / bloc rafraîchissement. Je ne même pas la peine d'essayer de faire quoi que ce soit intelligent comme le modèle de verrouillage à double contrôle; contention de verrouillage simple ne sera pas un problème car le temps passé dans la région critique sera pâle dans l'insignifiance par rapport aux frais généraux d'exploitation d'un service Web, sauf quand il bloque et tout le monde doit bloquer de toute façon.

Autres conseils

Puisque vous serez probablement en train de lire à partir du cache plus que vous allez écrire, j'utiliser un

scroll top