Wir entwickeln zwei verwandte Systeme. Eine davon (A) wird auf den Maschinen unserer Kunden installiert. Der Rest (B) wird von meiner Organisation verwendet.
Jedes System hat eine eigene Datenbank (relational) und ihre Schemata unterscheiden sich. Beide Systeme müssen jedoch synchronisiert werden. Außerdem müssen einige Änderungen in B in alle Systeme der Klasse A und andere nur in ein bestimmtes exportiert werden.
Einige Kunden haben keine Internetverbindung, daher muss die Synchronisierung in einigen Fällen über den Austausch von Dateien erfolgen.
Daher planen wir, dieses Problem wie folgt zu lösen:
- Jedes System führt ein Änderungsprotokoll seiner Datenbank. Wir planen, es mit MongoDB zu implementieren.
- Wenn ein System einen Synchronisierungsprozess initialisiert, ruft es alle vorgenommenen Änderungen aus einem Protokoll ab. Wenn das System B ist, hängen die abgerufenen Änderungen vom Ziel ab. Anschließend serialisiert das System sie im XML-Format und sendet sie schließlich (über eine Datei oder ein Netzwerk).
- Wenn der andere Endpunkt den Änderungssatz empfängt, werden er unserialisiert. Anschließend führt das System einige Transformationen über die Daten durch, die erforderlich sein können, und zeichnet schließlich die Änderungen auf. In diesem Schritt muss das System bei Bedarf die möglicherweise vorhandenen Konflikte lösen.
- Zuletzt sendet das Empfängersystem seine Änderungen (und andere Produkte der Konfliktlösung).
Ist dieser Ansatz machbar, skalierbar und elegant? Welche Änderungen oder Ergänzungen würden Sie vornehmen?
Antworten:
Wenn Sie dies noch nicht getan haben, ist es möglicherweise interessant, sich über ereignisgesteuerte Systeme, Ereignisbeschaffung und eventuelle Konsistenz zu informieren. Das System, das Sie beschreiben, weist viele Parallelen zu diesen Mustern auf, was gut ist.
Ihr Ansatz klingt gut, insbesondere:
Ohne mehr über das Domain-Modell zu wissen, gehe ich davon aus, dass die Lösung von Konflikten der Teil ist, der Ihnen die meisten Probleme bereitet. Ich würde einige Zeit damit verbringen, darüber nachzudenken, wie jede Art von Konflikt gelöst werden würde. Im Speziellen:
quelle
Sie können einen Eventstore verwenden . Dort wird durch jede Aktualisierung der Daten ein neues Ereignis im Geschäft erstellt.
Sie können einen beliebigen Mechanismus zum Senden von Ereignissen verwenden, es ist jedoch einfacher, wenn möglich einen Bus zu verwenden, bei dem Sie sich nicht mit Dateien befassen müssen. In der Regel können diese so konfiguriert werden, dass Nachrichten gespeichert werden, bis eine Konnektivität zum Senden verfügbar ist.
Wenden Sie die Ereignisse einfach auf Ihre Domain-Objekte an.
Verwenden Sie den gleichen Ansatz.
quelle