Pregunta

Mi proyecto de desarrollo actual tiene dos aspectos.En primer lugar, existe un sitio web público donde los usuarios externos pueden enviar y actualizar información para diversos fines.Luego, esta información se guarda en un servidor SQL local en las instalaciones de colo.

El segundo aspecto es una aplicación interna que los empleados utilizan para gestionar esos mismos registros (conceptualmente) y proporcionar actualizaciones de estado, aprobaciones, etc.Esta aplicación está alojada dentro del firewall corporativo con su propia base de datos local de SQL Server.

Las dos redes están conectadas mediante una solución VPN de hardware, que es decente, pero obviamente no es la más rápida del mundo.

Las dos bases de datos son similares y comparten muchas de las mismas tablas, pero no son 100% iguales.Muchas de las tablas de ambos lados son muy específicas para aplicaciones internas o externas.

Entonces la pregunta es:Cuando un usuario actualiza su información o envía un registro en el sitio web público, ¿cómo se transfieren esos datos a la base de datos de la aplicación interna para que puedan ser administrados por el personal interno?Y viceversa...¿Cómo se envían las actualizaciones realizadas por el personal al sitio web?

Cabe mencionar que cuanto más "en tiempo real" se produzcan estas actualizaciones, mejor.No es que tenga que ser instantáneo, sólo razonablemente rápido.

Hasta ahora, he pensado en utilizar los siguientes tipos de enfoques:

  1. Replicación bidireccional
  2. Interfaces de servicio web en ambos lados con código para sincronizar los cambios a medida que se realizan (en tiempo real).
  3. Interfaces de servicio web en ambos lados con código para sincronizar los cambios de forma asincrónica (utilizando un mecanismo de cola).

¿Algún consejo?¿Alguien que haya tenido el mismo problema?¿Se te ocurrió una solución que funcionó bien para ti?

¿Fue útil?

Solución

Creo que este es un escenario de integración bastante común.Personalmente, creo que lo ideal es una solución de mensajería asincrónica que utilice una cola.

Debería poder lograr una sincronización casi en tiempo real sin la sobrecarga o la complejidad de algo como la replicación.

Los servicios web síncronos no son ideales porque su código tendrá que ser muy sofisticado para manejar escenarios de falla.¿Qué sucede cuando se reinicia un sistema mientras el otro continúa publicando cambios?¿El sistema de envío obtiene tiempos de espera?¿Qué hace con esos?A menos que esté preparado para perder datos, querrá algún tipo de cola transaccional (como MSMQ) para recibir los avisos de cambio y encargarse de asegurarse de que lleguen al otro sistema.Si cualquiera de los sistemas está inactivo, los cambios (pasados ​​como mensajes) simplemente se acumularán y tan pronto como se pueda establecer una conexión, el servidor reiniciado procesará todos los mensajes en cola y se pondrá al día, haciendo que la integridad del sistema sea mucho, mucho más fácil de lograr.

Existen algunas herramientas de código abierto que realmente pueden facilitarle esto si usa .NET (especialmente si desea usar MSMQ).

  1. nServicioBus por Udi Dahan
  2. Tránsito masivo por Dru Sellers y Chris Patterson

También hay productos comerciales, y si está considerando una opción comercial consulte aquí para obtener una lista de opciones en .NET.Por supuesto, WCF puede enviar mensajes asíncronos usando enlaces MSMQ, pero una herramienta como nServiceBus o MassTransit le brindará una API de envío/recepción o Pub/Sub muy simple que hará que sus requisitos sean un trabajo muy sencillo.

Si está utilizando Java, existe una gran cantidad de implementaciones de bus de servicios de código abierto que harán que este tipo de mensajería asincrónica y bidireccional sea muy sencilla, como Mule o tal vez simplemente ActiveMQ.

Quizás también quieras considerar leer Udi Dahan's blog, escuchando algunos de sus podcasts.Aquí están algunos recursos más buenos para empezar.

Otros consejos

Estoy a la mitad de un proyecto similar, excepto que tengo varios sitios que necesitan mantenerse sincronizados a través de conexiones lentas (acceso telefónico en algunos casos).

En primer lugar, necesita realizar un seguimiento de los cambios, si puede usar SQL 2008 (incluso la versión Express es suficiente si el límite de 2 Gb no es un problema), esto aliviará enormemente la molestia, simplemente active el seguimiento de cambios en la base de datos y en cada tabla.Estamos usando SQL Server 2008 en la oficina central con el esquema extendido y SQL Express 2008 en cada sitio con un subconjunto de datos y un esquema limitado.

En segundo lugar, debe realizar un seguimiento de sus cambios, Servicios de sincronización funciona muy bien y admite el uso de una puerta de enlace WCF en la base de datos principal.En este ejemplo necesitarás usar el Sincronización mediante el cliente SQL Express ejemplo como punto de partida, tenga en cuenta que está basado en SQL 2005, por lo que deberá actualizarlo para aprovechar las funciones de seguimiento de cambios en 2008.De forma predeterminada, los servicios de sincronización utilizan SQL CE en los clientes, lo que estoy seguro no es suficiente en su caso.Necesitará un servicio que se ejecute en su servidor web que periódicamente (podría ser cada 10 segundos si lo desea) ejecute el método Synchronize().Esto le informará a su base de datos principal sobre los cambios realizados localmente y luego le preguntará al servidor todos los cambios realizados allí.Puede configurar el código SQL para obtener y aplicar para llamar a procedimientos almacenados y puede agregar controladores de eventos para manejar conflictos (p. ej.Actualización del cliente frente a Actualización del servidor) y resuélvalos en consecuencia en cada extremo.

Tenemos una tienda como cliente, con tres tiendas conectadas a la misma VPN
Dos de las tiendas tienen una computadora funcionando como "servidor" para esa tienda y la tercera tiene la "base de datos maestra"
Para sincronizar todo con el maestro no tenemos la mejor solución, pero funciona:hay una PC dedicada que ejecuta una aplicación que verifica la marca de tiempo de cada registro en cada tabla de las dos tiendas y si es diferente a la última vez que sincronizó, copia los resultados.
Tenga en cuenta que esto funciona en ambos sentidos.Es decir.Si actualiza un producto en la base de datos maestra, este cambio se propagará a las otras dos tiendas.Si tienes un nuevo pedido en una de las tiendas, se transmitirá al "maestro".
Con algunas optimizaciones puedes sincronizar todas las tiendas en unos 20 minutos.

Recientemente he tenido mucho éxito con SQL Server Service Broker, que ofrece mensajería asincrónica persistente y confiable lista para usar con muy pocos problemas de implementación.

  • Es rápido de configurar y, a medida que aprenda más, podrá utilizar algunas de las funciones más avanzadas.
  • Desconocido para la mayoría, también forma parte de las ediciones de escritorio por lo que puede usarse como sistema de mensajería en estaciones de trabajo.
  • Si tiene conocimientos de T-SQL, puede aprovecharlos, ya que todo el código para leer y escribir mensajes se realiza en SQL.
  • Es deslumbrantemente rápido

Es una parte de SQL Server muy poco publicitada y vale la pena echarle un vistazo.

Yo diría que simplemente tenga un trabajo que copie los datos de la tabla de entrada de la base de datos pública en una tabla pendiente de base de datos privada.Luego, una vez que actualice los datos en el lado privado, replíquelos en el lado público.Si no tiene actualizado ninguno de los datos replicados en el lado público, debería ser una solución de replicación transaccional bastante sencilla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top