sql - tutorial - trigger genérico para auditar cambios en una tabla
MSMQ v Tabla de base de datos (11)
Con MSMQ también puede descargar el trabajo a otro servidor muy fácilmente cambiando la ubicación de la cola a otra máquina en lugar del servidor de db.
Por cierto, a partir de SQL Server 2005, hay una cola incorporada en el DB. Se llama Service Broker de SQL Server. Ver: http://msdn.microsoft.com/en-us/library/ms345108.aspx
Un proceso existente cambia el campo de estado de un registro de reserva en una tabla, en respuesta a la entrada del usuario.
Tengo otro proceso para escribir, que se ejecutará de forma asíncrona para los registros con un estado particular. Leerá el registro de la tabla, realizará algunas operaciones (incluidas las llamadas a servicios web de terceros) y actualizará el campo de estado de la grabación para indicar que se ha completado el procesamiento (o por error, con un recuento de errores).
Esta operación suena muy similar a una cola. ¿Cuáles son los beneficios y desventajas de usar MSMQ en una tabla SQL en esta situación, y por qué debería elegir uno sobre el otro?
Es nuestro software el que agrega y actualiza los registros en la tabla.
Es una nueva pieza de trabajo (un servicio de Windows) que realizará el procesamiento asíncrono. Esto debe ser "siempre arriba".
En lugar de realizar llamadas MSMQ sin formato, podría ser más fácil si implementa su servicio como un componente COM + en cola y realiza llamadas a la función en cola desde su aplicación cliente. Al final, el servicio asíncrono todavía usa MSMQ en segundo plano, pero su código será mucho más claro y fácil de usar.
Hay varias razones, que fueron discutidas en el foro de Fog Creek aquí: http://discuss.fogcreek.com/joelonsoftware5/default.asp?cmd=show&ixPost=173704&ixReplies=5
El principal beneficio es que MSMQ aún se puede usar cuando hay conectividad intermitente entre computadoras (usando un mecanismo de almacenamiento y reenvío en la máquina local). En lo que respecta a la aplicación, entregó el mensaje a MSMQ, aunque MSMQ posiblemente entregará el mensaje más tarde.
Solo puede insertar un registro en una tabla cuando puede conectarse a la base de datos.
Un enfoque de tabla es mejor cuando se requiere un enfoque de flujo de trabajo, y el proceso se moverá a través de varias etapas, y estas etapas deben persistir en la base de datos.
Probablemente iría con MSMQ o ActiveMQ. Sugeriría (presumiendo que está considerando MSMQ que está usando Windows, con tecnología MS) investigando WCF, o si está usando MS-SQL 2005+ con un activador que llama al código .net para ejecutar su procesamiento.
Service Broker se introdujo en SQL 2005 y está diseñado para ser muy rápido en el manejo de mensajes, ya que el proceso es relativamente simple (creo que sus raíces estaban en los factores desencadenantes). Si le preocupa la escalabilidad, en SQL 2008 lanzaron un ejecutable de procesamiento independiente para separar el procesamiento de SQL Server (en Service Broker estándar, todo está controlado por las instancias de SQL Server).
Definitivamente, consideraría usar Service Broker en lugar de MSMQ, pero esto depende de sus recursos SQL Development / DBA y su conocimiento.
Si tiene experiencia en MSMQ, es una buena opción. Si conoce bases de datos pero no MSMQ, pregúntese si desea convertirse en experto en otra tecnología; si su aplicación es crítica; y que preferiría depurar cuando hay un problema.
Si la tasa a la que se crean los registros de reserva es baja, haría que el segundo proceso revise periódicamente la tabla para nuevas reservas.
A menos que ya esté usando MSMQ, presentarlo solo le brinda un componente de plataforma adicional para su compatibilidad.
Si la base de datos está muy cargada, o si obtiene mucha contención de bloqueo con dos procesos de lectura y escritura en la misma región de la tabla de reservas, entonces considere la posibilidad de presentar MSMQ.
Recientemente he estado investigando esto yo mismo, así que quería mencionar mis hallazgos. La ubicación de la base de datos en comparación con su aplicación es un factor importante a la hora de decidir qué opción es más rápida.
Probé insertando el tiempo que tardó en insertar 100 entradas de la base de datos en lugar de registrar exactamente los mismos datos en un mensaje MSMQ local. Luego tomé el promedio de los resultados de realizar esta prueba varias veces.
Lo que encontré fue que cuando la base de datos está en la red local, insertar una fila era hasta 4 veces más rápido que ingresar a un MSMQ.
Cuando se accedía a la base de datos a través de una conexión a Internet decente, insertar una fila en la base de datos era hasta 6 veces más lenta que el inicio de sesión en un MSMQ.
Asi que:
Base de datos local: DB es más rápido; de lo contrario, MSMQ sí lo es.
Además de la respuesta de Mitch, algunos otros escenarios: 1. cada uno de tus mensajes tiene su propia fecha de vencimiento para activar la acción, esto también se puede hacer a través de MQ, pero en este caso prefiero almacenarlo en db, ya que es más controlable ; 2. El suscriptor necesita filtrar el mensaje y luego procesar una parte del mismo, LINQ también lo puede hacer, depende de cuán complejo sea el filtro, el enfoque db es mejor porque puedo usar linq para EF hacer consultas complejas fácilmente; 3. Para la implementación, quiero un proceso de implementación totalmente automatizado para que DB sea una mejor opción para mí. No soy un gran admirador de las configuraciones manuales.
También me gusta esta respuesta de le dorfier en la discusión anterior :
Primero utilicé tablas, luego refactoré a una cola de mensajes completa cuando (y si) hay una razón, que es trivial si su diseño es razonable.
Gracias, amigos, por todas las respuestas. Más útil.
Ver también la discusión previa .