2009-04-16 9 views
3

Nous développons un projet qui implique environ 10 services WCF différents avec plusieurs points de terminaison chacun. Un des services garde quelques grandes tables de données mises en cache en mémoire.WCF: partage des données mises en cache sur plusieurs services

Nous avons constaté que nous avons besoin d'accéder à ces données d'un autre service. Plutôt que de garder 2 copies du cache, j'aimerais pouvoir partager ces tables sur tous les services.

Je l'ai fait quelques recherches et trouvé quelques articles sur l'utilisation d'un IExtension attaché aux servicehosts pour stocker les données partagées.

A condition que tous les services sont en cours d'exécution sous le même site web, cela fonctionnera? Et est-ce la bonne approche? Ou devrais-je regarder ailleurs?

Répondre

3

Si les données que vous mettez en cache sont requises par plusieurs services, cela ressemble - du point de vue de l'architecture orientée services, de toute façon - au fait qu'il n'appartient à aucun des services que vous appelez.

Si les données sont mises en cache pas vraiment lié à une ou l'autre service, mais est quelque chose que les deux services ont besoin, alors peut-être qu'il appartient à son propre service de séparé. Avez-vous envisagé d'encapsuler votre cache dans un troisième service et d'effectuer un appel de service à service pour récupérer les données dont vous avez besoin? Les avantages comprennent ...

  1. Il résout votre dilemme d'origine, évitant ainsi de lire plusieurs fois le cache de la base de données;
  2. Il encapsule le cache à un endroit pour faciliter la maintenance/modification ultérieure.
  3. Il vous permet d'abstraire l'implémentation du cache des autres services en plaçant une autre interface de service dans le chemin.

Dans l'ensemble, je dirais que c'est la meilleure approche. Le seul inconvénient est le surcoût supplémentaire de l'appel de service à service, mais cela surpasse certainement avoir à lire le cache entier à partir de la base de données. Alternativement, si les données dans votre cache sont très étroitement liées aux DEUX des services qui appellent le cache, c.-à-d. Les deux services ajoutent/modifient les données dans le cache, etc. alors peut-être les deux services existants devraient être combinés en un seul service.

Si ce que je dis est fait un certain sens, puis ensuite principe de SOA je dessine sur est Service Autonomy.

+0

Eh bien, c'est une application d'entreprise de taille moyenne. Je suis d'accord sur le point d'autonomie de service. À l'origine, les données devaient être lues à partir de DB à partir de plusieurs services, mais en raison des problèmes de performances, nous souhaitons les déplacer vers un cache en mémoire. Les données sont «essentielles» à de nombreux services. sens. –

+0

Merci pour la clarification. Personnellement, je vais certainement encapsuler le cache dans un autre service et mettre en œuvre les appels de service à service. Je vais mettre à jour ma réponse en conséquence. – razlebe

+1

Tout est correct, mais avec tout le respect, c'est un point de vue trop schématique. Au moins, je connais un type d'interaction entre services qui ne devrait pas être fait comme "service habituel": validation de jeton de sécurité (si nous allons le faire sur la couche application) entre la méthode de service et le fournisseur de jeton de sécurité liste des jetons valides). La même chose est sur la journalisation, la journalisation est quelque chose de spécial. Si vous vous connectez par le même bus d'entreprise, vous pouvez facilement le détruire. –

2

fourni tous vos services font partie de la même application, il ne semble pas être une raison pour laquelle vous ne pouvez pas partager le cache directement via une référence d'objet partagé. La manière la plus simple de le faire est via un champ statique.

Si vous choisissez cette approche, une chose à faire très attention à la sécurité est de fil. Si votre cache est accédé simultanément via deux sessions WCF, vous devez vous assurer que les deux sessions ne vont pas interférer les unes avec les autres en changeant le cache en même temps. Si le cache est en lecture seule, votre besoin de le faire est réduit, mais vous devrez peut-être procéder à une initialisation synchronisée du cache.

+0

J'ai souvent utilisé la méthode des variables statiques pour les applications régulières asp.net, mais je suis préoccupé par le cycle de vie des services. Le cache est-il garanti d'être initialisé si, par exemple, le service A tente d'accéder à la mémoire cache dans le service B qui n'a pas encore été appelé (activé)? –

+1

Vous devez placer le code d'initialisation dans la méthode statique ou le contrôleur de cache lui-même. De cette façon, il est encapsulé à la fois hors service A et B.Ni l'un ni l'autre ne dépendent l'un de l'autre pour initialiser le cache, le premier à y accéder provoque une initialisation paresseuse. –

Questions connexes