2009-03-13 3 views
2

Architecture de base: n boîtes physiques hébergeant chacune le même service WCF, installant un équilibreur de charge. Chaque boîte frapper une seule infrastructure de base de données qui ne prend pas en opérations de soutien - ne demande pas :(Transactions distribuées avec WCF

Ainsi, dans la couche d'accès aux données de mon application j'ai besoin d'une méthode de transactions distribuées Quelles sont mes options

.?

Notez que les clients à mon système sera héritage applications de communication en utilisant les services Web de base (BasicHttpBinding) et brillants nouveaux clients WCF (NetTcpBinding ou NetNamedPipeBinding).


Modifier 1

E.g. il y aura un seul appel dans la couche WCF sur la boîte physique 1, par ex. EditEntity (...). Cet appel va déclencher 2 écritures dans la base de données. Après la première écriture un autre client appelle EditEntity (...) pour la même entité sur une deuxième instance de mon service WCF sur une deuxième boîte physique. Dans la deuxième case, comment puis-je savoir qu'une transaction pour cette entité particulière est déjà en cours?

Merci.

Répondre

2

Vous n'êtes pas sûr de nous avoir donné assez pour continuer, mais si je lis correctement, vous essayez de vous assurer que vous pouvez supporter une transaction via votre service WCF? Alors que votre base de données ne prend pas en charge les transactions et que vos points de terminaison WCF se trouvent derrière un équilibreur de charge? Est-ce que j'ai ceci correct? Si oui ...

Étant donné que votre base de données n'a pas de support transactionnel, elle se déplace vers votre niveau WCF. Cela suggère un niveau grossier de granularité dans vos méthodes, de sorte que vous pouvez vous assurer qu'un seul appel à votre service WCF englobe suffisamment votre transaction. Ne répartissez pas une transaction entre plusieurs appels WCF, vous demandez des problèmes.


MISE À JOUR: Il existe des stratégies qui peuvent être utilisées avec les équilibreurs de charge qui assurent la persistance entre les connexions, mais cela ne vous aidera pas ici. Si vous appelez EditEntity() de façon consécutive, et que la première entrée consiste à lancer une transaction, et que la seconde entrée consiste à effectuer une transaction ... alors votre service n'est pas suffisamment granulaire. Consolidez ces deux appels à une seule méthode, c'est-à-dire EditEntityComplete().

Y a-t-il une raison pour laquelle vous ne pouvez pas créer une méthode, par opposition à deux? MISE À JOUR # 2: Reformulation du problème - une seule méthode effectue des entrées dans une base de données qui ne prend pas en charge les transactions. La méthode en question exécute une série d'étapes qui doivent être complétées dans l'ordre. La méthode WCF représente des opportunités pour la contention simultanée de violer l'achèvement de l'étape dans le bon ordre. Avec cette base, en supposant que vous ne requérez aucune donnée de retour de la fonction, considérez une file d'attente asynchrone qui peut enregistrer des demandes à partir des points de terminaison WCF. Traitez ensuite la file d'attente à partir d'un seul processus d'arrière-plan.


Révision finale:

Reconsidérer l'exigence de ne pas changer le magasin de données.Compte tenu des exigences pour les clients multiples, besoin d'échelle, l'équilibrage de la charge et le soutien transactionnel dans le magasin de données, une suggestion finale - pousser à changer la base de données. Comprendre cela est une exigence statique, mais vous devrez déployer beaucoup d'efforts pour mettre en œuvre un support transactionnel lorsque de nombreuses plates-formes de base de données simples vous le fourniront. Essayer de recréer cette fonctionnalité a peu d'avantages mais beaucoup de désavantages.

+0

Merci. Votre résumé est correct. Le problème est que le niveau WCF sera réparti sur plusieurs cases - c'est-à-dire à l'échelle. J'ai mis à jour ma question. – ng5000

+0

Il n'y a qu'une seule méthode. Cependant, il est appelé par deux clients différents et chaque demande est desservie par une boîte physique différente. – ng5000

+0

OK, je pense que j'ai une meilleure compréhension maintenant. Il semblait que deux appels consécutifs à EditEntity() étaient nécessaires pour effectuer une transaction. – jro