2011-11-06 16 views
5

En mi proyecto, recibo una transacción del cliente, la proceso y devuelvo un estado al cliente a través de WCF. Como saben, de alguna manera debo guardar la transacción para fines de recuperación y persistencia.MSMQ para persistencia?

Estoy pensando en usar MSMQ para ese fin. Cuando comience la transacción, la "guardaré" en MSMQ (la base de datos se guardará en un lote por motivos de rendimiento).

¿Es MSMQ bueno para eso? ¿Conoces una mejor forma de crear persistencia? ¿Cuál es la mejor manera de "respaldar" la transacción y mantener un alto rendimiento?

+0

MSMQ para el presidente! – stefan

Respuesta

5

Al escoger una tecnología Creo que es útil tener en cuenta no sólo puede la tecnología satisface sus necesidades, sino también si era diseñada para satisfacer sus necesidades. Con esto quiero decir que debes elegir la mejor opción en lugar de solo la primera opción que parece lo suficientemente buena. Probablemente pueda resolver este problema con archivos de registro o de texto u otros medios, pero eso no significa que deba hacerlo.

Mi orden de preferencia en esta situación sería

  1. base de datos
  2. MSMQ
  3. todo lo demás

Si no es posible guardar las transacciones a la base de datos por cualquier razón, entonces MSMQ probablemente pueda ayudarlo aquí. Debe funcionar mejor que una apertura de una conexión de base de datos & comprometiendo pero proporciona una "buena" capa de persistencia. El inconveniente es que hay más código y otro punto de falla para su aplicación (no es que falle si está escrito correctamente, pero más código significa más lugares para los errores).

Usted puede lanzar sus transacciones en una cola muy fácilmente usando algo como esto

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

y luego recuperarlos más tarde a través de propiedades que consultan: MSMQ querying for a specific message. Hay muchas otras funcionalidades listas para usar, pero mantenlo simple.

Algunas preguntas relevent:

+0

Gracias fue muy informativo – guyl

2

Un enfoque popular utilizado por la base de datos y los sistemas de archivos se denomina Registro de escritura anticipada. Sin embargo, esto no es trivial de implementar. Puede encontrar más detalles aquí ...

Wikipedia: Write-Ahead Logging

+0

+1 para la introducción de wal. – guyl

+0

¿Podría responder http://stackoverflow.com/questions/9702379/queuing-in-oneway-wcf-messages-using-windows-service-and-sql-server? – Lijo

3

Creo que busca SQL Server Service Broker. Todo lo que hace 10 años hicimos con MSMQ ahora lo estamos haciendo con el intermediario de servicios. Funciona bien.

+0

Service Broker es excelente, pero depende de la disponibilidad de la base de datos y del tiempo de respuesta, lo que puede ser algo que OP está tratando de evitar. –

+0

Esto se aplica a cualquier sistema de colas transaccionales por lo que no es relevante para un producto específico. – Deleted

+0

@ChrisSmith ¿Eso fue dirigido a mí? Use mencionar para que me notifiquen :) En este caso MSMQ se ejecutaría en el servidor web, por lo que no hay preocupación de 'disponibilidad': si el servidor web está en línea, también lo es el almacén de mensajes, mientras que la base de datos normalmente se ejecuta en otra máquina. Y el tiempo de respuesta es excelente porque MSMQ se ejecuta localmente, mientras que la base de datos puede estar en algún lugar del otro lado del mundo. –