2012-06-29 9 views
14

Antecedentes:de publicación/suscripción patrón en SQL

Tenemos una mesa grande (más de 15 millones de dólares) de los artículos que se actualiza con frecuencia durante el día (promedio 300K cambios diarios). Los cambios pendientes se almacenan en una tabla de etapas y un trabajo se ejecuta a lo largo del día para leer los cambios de esta tabla, realizar las actualizaciones y marcar los cambios como procesados.

Muchas otras aplicaciones usan los datos de la tabla de elementos para realizar diversas tareas. A menudo, estas tareas son programadas e intensivas, ya que implican la comparación de datos en tiempo real con instantáneas antiguas y la actualización de otros sistemas en consecuencia. Por ejemplo, enumeramos los artículos en eBay y comparamos los datos de los artículos en vivo con nuestros listados existentes para ver si necesitamos insertar cualquier nueva lista de eBay, eliminar los artículos que hemos vendido, cantidades de actualización, etc. Debido a que los datos son tan grandes, la mayoría de estas aplicaciones se ejecutan con poca frecuencia, dejando cosas desactualizadas la mayor parte del tiempo.

Mi Pregunta:

Estamos considerando la implementación de un modelo de editor/suscriptor mediante el Service Broker. El objetivo sería publicar un mensaje cuando un artículo cambie, al cual otros sistemas (como nuestra aplicación eBay) pueden suscribirse. Esto nos permitiría hacer actualizaciones más granulares más cerca de tiempo real, en lugar de actualizaciones grandes e infrecuentes que implican consultar todos los datos, no solo lo que ha cambiado. Sin embargo, después de usar Google, no parece que este sea un patrón de base de datos común, y eso levanta banderas rojas. ¿No es esto un uso válido de Service Broker (aunque encontré una pequeña sección en Pro Sql Server 2008 Service Broker al hacer Pub/Sub)? ¿Cómo se resuelve este problema normalmente? Parece un problema bastante común.

TL; DR:

Objetivo: Actualizar varios sistemas de una manera dinámica, débilmente acoplado cuando los elementos individuales cambian.

Pregunta: ¿Se ha implementado una solución de estilo pub/sub con Service Broker como una solución viable en una configuración de alto volumen?

+0

Dos preguntas: ¿por qué esas aplicaciones usan datos en la tabla de elementos principales en lugar de procesar los cambios pendientes en la tabla de etapas? Segundo: ¿necesita absolutamente SQL Server para mantener y publicar los elementos? –

+1

Eche un vistazo a la replicación SQL integrada, es lo suficientemente flexible como para acomodar una amplia gama de escenarios. – alexm

+0

@KubaWyrostek ese fue nuestro primer pensamiento, y lo que nos llevó a considerar el enfoque basado en mensajes. En lugar de leer de esa tabla de vez en cuando, ¿por qué no utilizarla como fuente de mensajes 'Elemento modificado'? Tal vez una capa innecesaria de abstracción, pero como la tabla de etapas se borra periódicamente de las actualizaciones procesadas, el pensamiento más seguro y más flexible sería Service Broker – Bort

Respuesta

0

No es un patrón de base de datos común porque la mayoría de las bases de datos relacionales están deplorablemente mal equipadas para hacerlo fuera de la caja. Servidor Sql también sería si no tuviera Service Broker.

Uno de los desarrolladores de Service Broker talks about how Service Broker handles the challenges that most companies turn to NoSQL solutions for.

Es mi entendimiento de que Service Broker está destinado a hacer exactamente lo que estás buscando. Incluso puede usar External Activation a run custom applications when the data has changed.

+0

Hablando de manera intuitiva: Service Broker daría una sobrecarga por este problema relativamente simple en comparación con la consulta simple sobre un índice agrupado de cambios con marcas de tiempo. Incluso la replicación unidireccional (como sugirió alexm) parece una mejor solución. Cuanto más universal sea la herramienta, mayor será la pena de rendimiento en mi humilde opinión. –

2

Esto es muy común patrón de integración.

No estoy familiarizado con SQL Server Service Broker, pero si miras cualquier pila de middleware de integración -TIBCO, Oracle, webMethods, Mule, Informatica, etc.- todas ofrecen un "adaptador de base de datos" que realiza la tarea que describes.

El patrón general es que las actualizaciones en la base de datos activan una publicación de mensaje. Esto se hace a través de un disparador en la tabla de la base de datos o mediante el adaptador "sondeo" de la tabla para nuevas actualizaciones. Cualquiera de los métodos tiene pros y contras.

El principal beneficio de este patrón es (como sospecha) actualizaciones más frecuentes y oportunas para otros sistemas: una forma más "en tiempo real" de hacer negocios.Además, si realiza la transformación a un formato de mensaje canónico, obtendrá un acoplamiento más flexible entre los sistemas y, por lo tanto, tendrá menos dolor cuando los sistemas deban modificarse o actualizarse.

0

Por lo general, este tipo de problemas se vuelven más grandes (en alcance) de lo que puede proporcionar una implementación de pub/sub basada en la base de datos. Si puedo hacer una recomendación, considere el uso de un bus de servicio a gran escala:

nServiceBus (libre hasta un cierto tamaño, pasado bastante barato que)

Usted recibe un marco pub/sub sólida, pero fácil trabaje con y hay una gran base de usuarios de clientes, artículos y muestras.