Mejores prácticas / Patrones para sincronización de datos bidireccional

52

Muy a menudo en mi trabajo surge la idea de la sincronización de datos bidireccional entre sistemas de bases de datos. El ejemplo clásico son dos sistemas CRM ligeramente diferentes (por ejemplo, Raiser's Edge y Salesforce) y la necesidad de tener una sincronización bidireccional de datos de contacto entre ellos.

Dejando a un lado las consideraciones de la API, suponiendo que tenga una clave compartida para sincronizar y simplemente pensando en el algoritmo / patrón que se empleará, esta es una tarea que a menudo no se subestima por los no técnicos.

Por ejemplo, debes tener cuidado con:

  • ¿Puede detectar fácilmente qué registros han cambiado en ambos sistemas (o tendrá que comparar todos los registros entre los sistemas para detectar cambios)
  • Si va a realizar una sincronización de una vez cada N horas, cómo lidiar con conflictos en los que el mismo registro cambia más o menos al mismo tiempo en ambos sistemas
  • Si va a realizar una sincronización en tiempo real (es decir, una actualización en un sistema desencadena inmediatamente una actualización en el otro sistema) cómo manejar la divergencia en el tiempo debido a errores o fallas del sistema

Personalmente, puedo pensar en formas de abordar todo esto, pero me pregunto si hay patrones conocidos, literatura o mejores prácticas a las que pueda referirme.

codeulike
fuente
lo que describe suena bastante cercano al sistema de base de datos federada, ¿es eso correcto?
mosquito
@gnat: Gracias por el enlace, algunas de las inquietudes son similares (por ejemplo, lidiar con la heterogeneidad), pero estoy hablando de sincronizar un subconjunto de datos de dos bases de datos autónomas, mientras que parece ser más acerca de crear una vista completamente integrada de todo a través de múltiples dbs.
codeulike
1
7 años después, 50 votos a favor pero solo 1 respuesta decente. Debe haber algunos patrones de sincronización o mejores prácticas por ahí?
codeulike

Respuestas:

8

Sí, un problema difícil, fácilmente subestimado. Y podría ser mucho trabajo. Si utiliza tecnologías de Microsoft, es posible que desee echar un vistazo a Microsoft Sync Framework aquí y aquí .

codingoutloud
fuente
1
Gracias, eso es interesante. Había oído hablar de Ms Sync Framework pero no me había dado cuenta de que era tan generalizado. Básicamente es un patrón para manejar problemas de sincronización en general.
codeulike
2
Microsoft Sync Framework fue reemplazado por Microsoft Sync Framework Toolkit.
Tomas Kubes
Estoy frustrado con los documentos, que no son tan claros, especialmente para los proveedores de datos ADO.NET que no son servidores SQL, que es mi caso. Además, mi lugar de trabajo está buscando algo que no requiera agregar tablas de infraestructura / hacer cambios en el entorno de Producción. Así que estoy a punto de descartar este.
Veverke
0

Existen muchas teorías sobre la sincronización de bases de datos de sitios remotos. Primero comience con INSERT. manejar este es fácil, ya que puede crear una ID única para cada sitio (por ejemplo, una inicial del nombre del sitio + ID (número): site_a_177 vs. site_b_53)

Por lo tanto, insertar no debería crear ningún conflicto. El problema es la actualización. No creo que haya un método 100% a prueba de fallas, pero puede comenzar una actualización "bloqueando" el registro en la base de datos remota, y solo después de obtener el identificador: continúe con la actualización y termine sincronizando la actualización y solo entonces suelte la cerradura.

alfasin
fuente
1
Gracias, creo que estás hablando de dbs distribuidos con el mismo esquema y de transacciones distribuidas. Estoy pensando más en escenarios en los que los dos DB son completamente autónomos (por ejemplo, asignan identificadores únicos de formas completamente diferentes y los esquemas difieren) pero desea sincronizar un subconjunto de los datos en ellos.
codeulike
Parece que no debería haber ningún conflicto. En ese caso, debería ser muy simple: simplemente guarde el "último ID de registro" que se sincronizó para cada tabla y continúe desde allí.
alfasin