Synchronisation zwischen zwei Systemen mit MongoDB als Changelog


11

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:

  1. Jedes System führt ein Änderungsprotokoll seiner Datenbank. Wir planen, es mit MongoDB zu implementieren.
  2. 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).
  3. 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.
  4. 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?


Haben Sie sich Tools angesehen, die mit einem der beiden DBMS verknüpft sind, um bei replizierten Daten zu helfen? Welche DBMS sind beteiligt?
Adam Zuckerman

Wir verwenden MySQL 5.5.8. Wir haben uns einige Tools angesehen, aber wir glauben, dass sie nicht unseren Anforderungen entsprechen.
k91

Eine Gefahr besteht darin, dass ObjectIds nicht monoton ansteigen.
CodesInChaos

Antworten:


1

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:

  • Die Verwendung eines geordneten Änderungsprotokolls bedeutet, dass der Synchronisierungsprozess nur Änderungen abrufen kann, die seit der letzten Änderung vorgenommen wurden. Dadurch wird die Verarbeitungszeit niedrig gehalten, was die Skalierbarkeit verbessert und es Ihnen ermöglicht, eine Synchronisierung nahezu in Echtzeit zu erstellen, wenn eine Internetverbindung verfügbar ist.
  • Kunden ohne Internetverbindung zwingen Sie dazu, sich jetzt mit verzögerter und nicht ordnungsgemäßer Synchronisierung zu befassen, anstatt sich auf eine schnelle Synchronisierung zu verlassen und versehentlich Probleme mit der Skalierbarkeit zu haben.

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:

  • Werden einige Konflikte eine Benutzerlösung erfordern?
  • Wird das Kundensystem immer der richtige Ort sein, um Konflikte zu lösen?
  • Kann es nach Schritt 4 zu Konflikten in System B kommen, wenn das Kundensystem seine Änderungen sendet?

0

Jedes System führt ein Änderungsprotokoll seiner Datenbank. Wir planen, es mit MongoDB zu implementieren.

Sie können einen Eventstore verwenden . Dort wird durch jede Aktualisierung der Daten ein neues Ereignis im Geschäft erstellt.

Wenn ein System einen Synchronisierungsprozess initialisiert, ruft es alle vorgenommenen Änderungen aus dem 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).

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.

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.

Wenden Sie die Ereignisse einfach auf Ihre Domain-Objekte an.

Zuletzt sendet das Empfängersystem seine Änderungen (und andere Produkte der Konfliktlösung).

Verwenden Sie den gleichen Ansatz.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.