Estamos desarrollando dos sistemas relacionados. Uno de ellos (A) se instalará en las máquinas de nuestros clientes. El resto (B) será utilizado por mi organización.
Cada sistema tiene su propia base de datos (relacional) y sus esquemas difieren. Sin embargo, ambos sistemas tienen que estar sincronizados. Además, algunos cambios en B deben exportarse a todos los sistemas de clase A y otros solo a uno específico.
Algunos clientes no tienen conexión a Internet, por lo que la sincronización, en algunos casos, debe realizarse mediante el intercambio de archivos.
Entonces, estamos planeando resolver este problema de la siguiente manera:
- Cada sistema mantiene un registro de cambios de su base de datos. Estamos planeando implementarlo con MongoDB.
- Cuando un sistema inicializa un proceso de sincronización, recupera todos los cambios realizados desde un registro. Si el sistema es B, los cambios recuperados dependen del destino. Luego, el sistema los serializa en formato XML y, finalmente, los envía (a través de un archivo o una red).
- Cuando el otro punto final recibe el conjunto de cambios, los deserializa. Luego, el sistema realiza algunas transformaciones sobre los datos, que pueden ser necesarias, y finalmente, registra los cambios. En este paso, si es necesario, el sistema tiene que resolver los conflictos que puedan existir.
- Por último, el sistema receptor envía sus cambios (y otros productos de resolución de conflictos).
¿Es este enfoque factible, escalable y elegante? ¿Qué cambios o adiciones harías?
Respuestas:
Si aún no lo ha hecho, puede que le resulte interesante leer sobre sistemas controlados por eventos, fuente de eventos y consistencia eventual. El sistema que está describiendo tiene muchos paralelos con estos patrones, lo cual es algo bueno.
Su enfoque suena bien, en particular:
Sin saber más sobre el modelo de dominio, supongo que resolver conflictos es la parte que le causará más problemas. Pasaría un tiempo pensando en cómo se resolvería cada tipo de conflicto. En particular:
fuente
Puedes usar un almacén de eventos . Cualquier actualización de datos creará un nuevo evento en la tienda.
Puede usar cualquier mecanismo para enviar eventos, pero sería más fácil usar un bus si es posible donde no tiene que lidiar con archivos. Por lo general, estos pueden configurarse para retener mensajes hasta que haya conectividad disponible para enviarlo.
Simplemente aplique los eventos a sus objetos de dominio.
Usa el mismo enfoque.
fuente