2011-11-06 12 views
5

Nel mio progetto ricevo una transazione dal client, quindi la processo e restituisco uno stato al client tramite WCF. Come sai, devo in qualche modo salvare la transazione a fini di recupero e persistenza.MSMQ per la persistenza?

Sto pensando di utilizzare MSMQ per questo scopo. Quando inizia la transazione, lo "salverò" su MSMQ (il salvataggio del database avverrà in un batch per motivi di prestazioni).

MSMQ è buono? Sai del modo migliore per creare persistenza? Qual è il modo migliore per "fare il backup" della transazione e mantenere alte prestazioni?

+0

MSMQ per il presidente! – stefan

risposta

5

Quando scegliere una tecnologia Penso che sia utile considerare non solo può la tecnologia soddisfare le vostre esigenze, ma anche se era progettata per soddisfare le vostre esigenze. Con questo intendo che dovresti scegliere l'opzione migliore piuttosto che la prima opzione che sembra abbastanza buona. Probabilmente potresti risolvere questo problema con file di registrazione o di testo o con altri mezzi, ma questo non significa che dovresti.

mio ordine di preferenza in questa situazione sarebbe

  1. banca dati
  2. MSMQ
  3. tutto il resto

Se non è possibile salvare le transazioni di database per qualsiasi ragione, allora MSMQ probabilmente può aiutarti qui. Dovrebbe funzionare meglio di un'apertura di una connessione al database &, ma ancora fornisce un livello di persistenza 'buono'. Il lato negativo è che è più codice e un altro punto di errore per la tua applicazione (non che fallirà se scritto correttamente, ma più codice significa più posti per bug).

Si può gettare le transazioni in una coda molto facilmente usando qualcosa di simile

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(); 

e quindi recuperare in un secondo momento attraverso le proprietà interrogazione: MSMQ querying for a specific message. C'è un sacco di altre funzionalità fuori dalla scatola ma è semplice.

Alcune domande pertinenti ripresi:

+0

Grazie, è stato molto istruttivo – guyl

2

Un approccio popolare utilizzato dal database e dai file system si chiama Write-Ahead Logging. Questo non è tuttavia banale da implementare. È possibile trovare i dettagli qui ...

Wikipedia: Write-Ahead Logging

+0

+1 per l'introduzione di wal. – guyl

+0

Potresti rispondere http://stackoverflow.com/questions/9702379/queuing-in-oneway-wcf-messages-using-windows-service-and-sql-server? – Lijo

3

Penso che si sta cercando SQL Server Service Broker. Tutto ciò che 10 anni fa abbiamo fatto con MSMQ ora stiamo facendo con il broker di servizi. Funziona bene.

+0

Service Broker è ottimo ma fa affidamento sulla disponibilità del database e sul tempo di risposta, il che può essere qualcosa che OP sta cercando di aggirare. –

+0

Questo vale per qualsiasi sistema di accodamento transazionale quindi non è rilevante per un prodotto specifico. – Deleted

+0

@ChrisSmith Era diretto a me? Usare menzionando così mi viene notificato :) In questo caso MSMQ verrebbe eseguito sul server Web stesso, quindi non c'è alcuna preoccupazione di "disponibilità" - se il server web è online, lo stesso vale per l'archivio messaggi, mentre il database generalmente viene eseguito su un'altra macchina. E il tempo di risposta è ottimo perché MSMQ viene eseguito localmente, mentre il database potrebbe trovarsi da qualche parte nel mondo. –