2011-11-06 4 views
5

Dans mon projet, je reçois une transaction du client, puis la traite et renvoie un statut au client via WCF. Comme vous le savez, je dois en quelque sorte enregistrer la transaction à des fins de récupération et de persistance. Je pense à utiliser MSMQ à cette fin. Lorsque la transaction commence, je vais l'enregistrer sur MSMQ (la sauvegarde de la base de données se produira dans un lot pour des raisons de performances).MSMQ pour la persistance?

Est-ce que MSMQ est bon pour ça? Savez-vous de meilleure façon de créer de la persistance? Quelle est la meilleure façon de "sauvegarder" la transaction et de garder une haute performance?

+0

MSMQ pour le président! – stefan

Répondre

5

Lors de la cueillette d'une technologie, je pense qu'il est utile de considérer non seulement peut la technologie répondre à vos besoins, mais aussi si elle était conçu pour répondre à vos besoins. Par ceci je veux dire que vous devriez choisir la meilleure option plutôt que juste la première option qui semble assez bonne. Vous pourriez probablement résoudre ce problème avec des fichiers de journalisation ou de texte ou d'autres moyens, mais cela ne veut pas dire que vous devriez le faire.

Mon ordre de préférence dans cette situation serait

    base de données
  1. MSMQ
  2. tout le reste

S'il est impossible d'enregistrer les transactions à base de données pour une raison quelconque, puis MSMQ peut probablement vous aider ici. Il devrait fonctionner mieux qu'une ouverture d'une connexion à la base de données & en fournissant pourtant une couche de «bonne» persistance. L'inconvénient est que c'est plus de code et un autre point d'échec pour votre application (pas que cela échouera s'il est écrit correctement, mais plus de code signifie plus d'endroits pour les bogues).

Vous pouvez jeter vos transactions dans une file d'attente très facilement en utilisant quelque chose comme ça

private string queuePath = @".\Private$\myQueue"; 
MessageQueue queue = new MessageQueue(queuePath); 

Message message = new Messge(); 
message.Id = "messageId"; 
message.Body = "my content"; 

queue.Send(message, transaction); 
transaction.Complete(); 
queue.Close(); 

puis les récupérer plus tard dans des propriétés d'interrogation: MSMQ querying for a specific message. Il y a beaucoup d'autres fonctionnalités hors de la boîte, mais gardez les choses simples.

Quelques questions relevent:

+0

Merci c'était très instructif – guyl

2

Une approche populaire utilisée par les bases de données et les systèmes de fichiers s'appelle Write-Ahead Logging. Ce n'est pas trivial à mettre en œuvre. Vous trouverez tous les détails ici ...

Wikipedia: Write-Ahead Logging

+0

+1 pour introduire wal. – guyl

+0

Pourriez-vous s'il vous plaît répondre http://stackoverflow.com/questions/9702379/queuing-in-oneway-wcf-messages-using-windows-service-and-sql-server? – Lijo

3

Je pense que vous cherchez SQL Server Service Broker. Tout ce que nous avons fait avec MSMQ il y a 10 ans avec le courtier Service. Ça marche bien.

+0

Service Broker est génial, mais repose sur la disponibilité de la base de données et le temps de réponse, ce qui peut être quelque chose que OP essaie de contourner. –

+0

Cela s'applique à tout système de mise en file d'attente transactionnel, donc ce n'est pas pertinent pour un produit spécifique. – Deleted

+0

@ChrisSmith Était-ce dirigé vers moi? Utilisez mention pour que je sois averti :) Dans ce cas, MSMQ fonctionnerait sur le serveur web lui-même, donc il n'y a pas de problème de disponibilité - si le serveur web est en ligne, le magasin de messages fonctionne, alors que la base de données fonctionne sur une autre machine. Et le temps de réponse est important car MSMQ s'exécute localement, tandis que la base de données peut se trouver quelque part à l'autre bout du monde. –