Nous développons deux systèmes liés. L'un d'eux (A) sera installé sur les machines de nos clients. Le reste (B) sera utilisé par mon organisation.
Chaque système possède sa propre base de données (relationnelle) et leurs schémas diffèrent. Cependant, les deux systèmes doivent être synchronisés. De plus, certaines modifications de B doivent être exportées vers tous les systèmes de classe A et d'autres uniquement vers un système spécifique.
Certains clients n'ayant pas de connexion Internet, la synchronisation, dans certains cas, doit être effectuée via l'échange de fichiers.
Nous prévoyons donc de résoudre ce problème comme suit:
- Chaque système tient un journal des modifications de sa base de données. Nous prévoyons de l'implémenter avec MongoDB.
- Lorsqu'un système initialise un processus de synchronisation, il récupère toutes les modifications apportées à partir d'un journal. Si le système est B, les modifications récupérées dépendent de la destination. Ensuite, le système les sérialise au format XML et, enfin, les envoie (via un fichier ou un réseau).
- Lorsque l'autre noeud final reçoit l'ensemble de modifications, il les désérialise. Ensuite, le système effectue des transformations sur les données, ce qui peut être nécessaire, et enfin, enregistre les modifications. Dans cette étape, si cela est nécessaire, le système doit résoudre les conflits qui pourraient exister.
- Enfin, le système récepteur envoie ses modifications (et d'autres produits de résolution de conflits).
Cette approche est-elle faisable, évolutive et élégante? Quels changements ou ajouts apporteriez-vous?
Réponses:
Si vous ne l'avez pas déjà fait, vous trouverez peut-être intéressant de vous renseigner sur les systèmes événementiels, la recherche d'événements et la cohérence éventuelle. Le système que vous décrivez présente de nombreux parallèles avec ces modèles, ce qui est une bonne chose.
Votre approche sonne bien, en particulier:
Sans en savoir plus sur le modèle de domaine, je suppose que la résolution des conflits est la partie qui vous causera le plus de problèmes. Je passerais un certain temps à réfléchir à la manière dont chaque type de conflit serait résolu. En particulier:
la source
Vous pouvez utiliser un magasin d' événements . Là, toute mise à jour des données créera un nouvel événement dans le magasin.
Vous pouvez utiliser n'importe quel mécanisme pour envoyer des événements, mais il serait plus facile d'utiliser un bus si possible où vous n'avez pas à traiter de fichiers. En règle générale, ceux-ci peuvent être configurés pour conserver les messages jusqu'à ce que la connectivité soit disponible pour les envoyer.
Appliquez simplement les événements à vos objets de domaine.
Utilisez la même approche.
la source